常见问题帮助

1.sober 是什么?有什么作用?

sober 是一个类似hibernate,ibatis 的结合体(主要指用法上),运行原理是直接使用sql.特点是避免了hibernate的缺点,使用ibatis的优点作为补充.减少关联查询的麻烦. 两种方式并用,完成各种查询是没有问题的,目前主要支持的数据库:oracle,mysql,postgresql,db2. 个人更喜欢postgresql.

2.Jspx.net Framework 和springboot,struts 2有什么不同?

构架和实现方案,结构层基本相同.struts2基本上已经不使用了,springboot很灵活,注释标签功能强大也多,提供一个整合各种组件的解决方案。 Jspx.net Framework 相对来说比springboot简化了些.但主体的功能 url映射,orm,cache,模版引起,分布式调用,文档生成这些常用的功能已经内置,60%的应用都不需要在整合第三方组件。 代码解决了很多踩坑的问题.使用上简洁些。分布式支持上不同,Jspx.net Framework是多个微服务可以同时部署在一个架构里边运行。 是用命名空间划分各个微服务。主要是满足用户的空间功能弱,不允许部署多个微服务更不要说docker这些,但同时又要求以后能扩展成分布式。

3.scriptmark模板和其他的模板有什么不同?

scriptmark 使用的是javascript引擎,早期是因为freemaker不稳定的一个替代品。现在是用在模版生成,sql代码生成等地方。

4.他们是如何协作工作的?

功能分层上和ssh很接近springboot都差不多,都是mvc结构和restFull接口方式支持。 sober完成数据库的操作(DAO) ,TXWeb完成URL事件逻辑映射.scriptmark作为TXWeb显示的表现层模板语言(API接口就不用了).另外底层部分包括了ioc. 等功能协同工作. 通过环境工厂EnvFactory 得到平台信息.如同我们要得到windows的环境变量一样.这个平台提供了你说要的基本功能,配置好后调用就可以了.启动部分可以看boot目录.启动的时候会自动的找.jspx.net.xml 文件,这个文件的所在目录将作为默认的配置文件保存目录.配置里边支持通配符引入 例如 这样当你要部署新的应用的时候只要拷贝配置文件到这个目录里边就可以了. 当然配置文件拷贝进来后不会立即生效,需要过一定时间才会生效.如果你想人工控制,你可以调用.JspxNetApplication 里边的 restart 方式.这里提供了一些平台运行的基本信息.和启动控制.虽然他们被放在一个包里边,但功能是相互独立的,你可以只使用其中的一部分功能也可以。

5.ajax如何处理.

当spring的请求方式已经成为一种标准,这里的请求方式一样,不过还支持一些加密功能,有必要使用的时候可以看 txweb部分。 默认是用后缀jwc。

6.这里的JSON解析器和其他的解析器有什么不同?

入参是用的是gson,API输出josn解析器是对日期,空等常见问题做了封装处理的.减少入坑。提供了几个常用的json解析注释标签,JsonField,JsonIgnore

7.如何制作一个有restFul风格的的网站?

如下配置访问地址就是: http://xxx/user/collect/list.jwc
@HttpMethod(caption = "收藏", actionName = "*", namespace =  "user/collect")
@Bean(namespace = Jmall.namespace, singleton = true)
public class CollectAction extends ActionSupport {
    @Operate(caption = "收藏店铺列表", method = "list")
    public RocResponse<List<CollectShopVo>> getShopList(@Param(caption = "页数") int currentPage,
                                                        @Param(caption = "条数") int count,
                                                        @Param(caption = "分组ID", max = 32) String groupsId,
                                                        @Param(caption = "名称", max = 128) String name) {
    }
}

8.我想只使用部分我喜欢的功能行吗?

可以,只是用模版功能,或者sober,json器都可以,目前也测试了可以嵌入到致远OA,金蝶EAS,用友YonBip中使用部分功能.

9.稳定性如何?

目前.7*365开机也没问题.稳定性是完全可以不用担心的问题,性能能上也不会存在瓶颈,性能的关键点是数据库结构的设计上。 5.x版本就已经很稳定,已经停止维护,6.x版本一直在测试使用中,都已经比较稳定。6.64版本为里程碑版本。如果发现什么bug也可以联系我为你解决。

10. 性能如何?

模板语言的原理就决定了他的速度.模板语言的解析速度和freemaker差不多,高并发的时候优于freemaker,所以freemaker模板能用的应用都能用。 虽然freemaker说能达到html的速度,但本人并不这样认为,毕竟模板语言还要解析一次才能输出。 一个软件的性能主要取决数据库,而模板部分的执行时间是很少,几乎可以忽略不计。 Scriptmark模板引擎的性能和稳定性,都非常优秀。任何一个数据处理型系统的优化核心还是sql,只有当数据库到达瓶颈后,才是分布式。

11.模板页面里边如何使用action bean ?

使用action bean 有下边几种方法:
  1. 根据TXWeb 的配置,映射到相应的模板文件,那么这个模板文件会自动的载入你所配置的action.
  2. 在页面里边你也可以使用action函数来创建。 本平台的action,如果是使用ioc方式配置的,那么这些对象将会保存在ioc容器里边.ioc将会关联这些action bean对象的销毁。
例如:
 <#assign tree="'treeview@jcms'.action(true,false,'nodeId=jcms1')" />
表示创建jcms命名空间下的treeview action,里边的参数分别表示,true 表示是否接受外部请求参数,false 表示是否执行execute部分,这里也可以是一个方法名,表示要执行某方法.后边可以是其他参数.以后使用tree这个名称就可以调用了。 日志在那里

12.如何得到request的参数?

传统方式:
  1. 在action里边很简单,有两种方法,一个是定义方法名称,提交后自动注入和struts 2一样.另外一个方法 是直接使用父类方法 比如得到字符串 getString("变量名称") ,getInt("变量名称"),提供了各种基本类型的转换得到,在ide里边都会有提示的.
  2. 在模板页面里边,要得到直接调用父类方法就能够方便的得到了例如, action.getString("变量名")
API方式和springboot一样

13. 传统方式如何得到当前模板页面的路径?

  1. 在action里边getTemplatePath()
  2. 在模板页面action.getTemplatePath()

14.日志在那里,如何调试?

日志目录在文件夹/WEB-INF/logs/下边,控制日志的输出你可以使用jspx.properties文件中的参数来配置.
    error=true
    fatal==true
    info=true
    debug=true
上边部分表示系统的日志,jspx的部分表示构架部分.要显示查询SQL这些的时候注意将debug设置为true, 在生产环节中一定要设置debug=false,这样性能会提高。 6.4 以后的版本同时也提供了日志保存到数据库的功能. 开启只需要配置 dbLog=true

15.出现乱码,如何解决?

首先你确定你使用的编码方式.系统默认使用的都是UTF-8编码,所以推荐默认使用UTF-8编码方式.jspx.properties文件中可以配置 encode=UTF-8. 你其他的几个部分也必须保证编码一致才不会出现乱码问题.
  1. 你的文件保存编码.
  2. 你的数据库保存编码.
  3. 如果你使用Tomcat 中也设置连接编码
  4. 配置好操作系统的默认编码,systemEncode=GBK 保证上边的统一,就不会有编码问题了.
另外针对 Tomcat配置了自动转换乱码功能,根据你的需要来配置 repairEncode=auto //表示自动识别,true表示开启,false表示关闭此功能 repairRequestMethod=get //要修复的方式 get;post;*表示都修复 tomcat9版本以后已经不会出现乱码了.

16.在tomcat里边是用Servlet配置和filter配置有什么不同?

如果你的应用比较简单,推荐使用filter方式,filter方式不需要配置listener. 而servlet方式要配置listener.servlet方式使用在有多种脚本在应用中使用的时候比较时候.你可以在实际应用中配置servlet的url-pattern为你实际的后缀更好. 配置如下: 注意:jhtml表示你操作的文件后缀
  <servlet>
      <servlet-name>servlet_txweb</servlet-name>
      <servlet-class>com.github.jspxnet.txweb.dispatcher.ServletDispatcher</servlet-class>
   </servlet>

   <servlet-mapping>
      <servlet-name>servlet_txweb</servlet-name>
      <url-pattern>*.jhtml</url-pattern>
   </servlet-mapping>

   <servlet-mapping>
      <servlet-name>servlet_txweb</servlet-name>
      <url-pattern>*.jwc</url-pattern>
   </servlet-mapping>

   <servlet-mapping>
      <servlet-name>servlet_txweb</servlet-name>
      <url-pattern>*.md</url-pattern>
   </servlet-mapping>

   <servlet-mapping>
      <servlet-name>servlet_txweb</servlet-name>
      <url-pattern>*.cmd</url-pattern>
   </servlet-mapping>

17.站点的后缀名和模板扩展名称是否可以改变?

可以,.jspx.properties文件templateSuffix=ftl表示的是模板后缀名称,你可以将模板保存为其他后缀名称,只要和这里对应就可以了.而站点页面的后缀配置为suffix=jsp 这里最好和Servlet或过滤一样.这样你之用使用文件名称+这里的配置扩展名称就可以访问页面了. 我们推荐使用jhtml这个后缀比较规范一点。不同的后缀系统执行方式不同,api接口方式是用jwc后缀(json参数方式).调试可以是用cmd后缀 (简单入参数方式).

18.启动的时候会看到DefaultPath=xxxxx这个路径有什么意义?

系统启动后本构架会查找jspx.net.xml文件,进行必要的初始化工作.找到jspx.net.xml文件的目录将做为默认目录.查找其他的配置文件也在这个目录查找. 当本构架做为C/S构架使用的时候,也同样可以查找jspx.net.xml文件做为默认目录,相当于配置文件目录. 你也可以直接打包到resources目录里边,系统会自动找.默认路径可以自己搜索

19.模板能做那些事情?

模板部分使用了javascript引擎,可以调用java类,所以和jsp 一样强。能删除文件,本地运行还可以写UI界面。 如果你不希望javascript 有太高的权限,可通过修改jvm的安全配置文件来控制。当然现在还是推荐是用API接口方式.

20. sober 对那个数据库支持好?

我们主要以主流开源数据库支持更好,推荐使用PostgreSQL或者 Mysql5.7.X以上版本.

21. 应用集成

集成了简单的用户,角色,权限,在线信息的基础功能实现.对应用户来说,可以用可不用.

22.提示信息注意事项

发生错误:
addFieldInfo(Environment.warningInfo, "错误:" + x);
Environment.warningInfo 表示错误提示级别 成功:
addActionMessage("保存成功");
页面上使用 将会显示相关提示信息。
<@information /> 
API接口的时候直接用 RocResponse 封装返回,上边是传统的方式.

23.日志记录方式说明

action中提供了动作日志记录说明,注意配置系统默认提供的拦截器
setActionLogTitle("日志标题");
//日志内容,保存被修改前的数据
setActionLogContent(new JSONObject(bean对象).toString(4));

24.路径查找配置方式

通过一下方式能够得到文件路径
   File file =  EnvFactory.getFile("classpath*:/jspx/jembed/*/LicenseService.class");
   File file =  EnvFactory.getFile("classpath:/jspx/jembed/service/LicenseService.class");
   File file =  EnvFactory.getFile("java.library.path:*.dll");
   File file =  EnvFactory.getFile("defaultPath:*.png");
   File file =  EnvFactory.getFile("*.png");