1. 统一字符集
要想不在页面上或者数据库中出现乱码,首先必须统一页面、Struts和数据库的字符集。
页面上通常会在如下两种地方设置:
<meta http-equiv=Content-Type content="text/html;charset=utf-8">(html代码)
<% page pageEncoding=”utf-8” … %>(jsp代码)
Struts必须在struts.xml配置文件中设置:
<constant name=”struts.i18n.encoding” value=”utf-8” />
Struts2中struts.i18n.encoding的默认值为utf-8,设置了这个值就相当于总是调用HttpServletRequest对象的setCharacterEncoding方法。
数据库中可以通过default character set … collate …来指定所创建的数据库的字符集,也可能通过default charset=… collate= …来指定数据表的字符集。
以上三者一致就能保持整个系统从页面到JavaEE代码到数据库的字符集统一。
2. action扩展名
通常,如果action的扩展名选用默认的“.action”或无扩展名,可以直接在Struts2的web.xml配置文件中如下设置:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这也是MyEclipse的默认设置。
但是,如果要改变action的扩展名,如改为 “.do” ,那么除了将上面的<url-pattern>标签中的 /* 改为 *.do 以外:
<url-pattern>*.do</url-pattern>
还需要在struts.xml文件中设置struts.action.extension属性的值,如下:
<constant name=”struts.action.extension” value=”do” />
否则Tomcat仍然找不到你指定的Action类。而这是MyEclipse缺省情况下并没有补充的。
3. 无法找到result input对应的页面
如果实现的Action继承自ActionSupport类,在action的执行方法中并没有返回 “input” 字符串的情况下仍然会出现这种的错误:
No result defined for action com.LoginAction and result input
其原因是继承自ActionSupport类的action会自动对setter获取到的表单数据进行validate,即对其数据类型的验证。如果表单输入的数据类型与action中接收该数据的变量类型不一致,如对Date类型的变量传入非法字符串等,那么ActionSupport类会使action跳过execute方法(或其它的action执行方法),直接返回“input”字符串。
解决的方法是检查变量的类型,并尽量将不适合的类型(如Date等)改为更加通用的类型(如String等),同时在前端进行格式是否合法的验证。
4. 现存的错误将影响项目发布
如果当前的Web Project中仍然存在严重错误,那么通过MyEclipse将其发布(deploy)到服务器(Tomcat)中的操作将失败。这种类型的错误包括:
1. Java源代码中仍存在语法错误
2. 引用的外部jar包失效(Build Path)
3. 配置文件(web.xml,struts.xml等)中存在语法错误
以上这些错误必须解决之后项目才能发布。而诸如html或js等语法错误则不会影响发布。
研一的生活已经过去大半年了,这段时间我除了上课和玩以外可以说也学了几乎大半个本科时期的东西,除了写博客变得懒惰了以外。
现在又要开始实习了,先把最近这段时间总结的东西记下来,以备之后会用到。