读《黑暗浪子写的struts2讲义》
<url-pattern></url-pattern>中的“/*”是个通配符,它表明该过滤器是拦截所有的HTTP请求。基本上是不会改成其他形式,因为在开发中所有的HTTP请求都可能是一个页面上进行业务逻辑处理的请求。就目前而言,开发人员只需要写成“/*”就可以了
Encoding是可选的,如果不写则默认UTF-8,该文件代码中的gb2312表明该文件的编码集是gb2312,支持中文字符。常见的字符编码集有支持简体中文的gb2312,支持繁体中文的GBK,支持西欧字符的ISO8859-1以及通用的国际编码UTF-8DTD文件必被声明,它表明struts.xml是支持Struts2.0的文档类型定义。DTD全称为Document Type Definition(文档类型定义)。
package里定义了Action映射申明。它也可以包含很多<action>或者一个也不包含(当然实际开发中是不可能一个都不包含的)。其中name属性内容是开发的web项目名称,比如本章代码是C04项目,所以代码里写的是C04。而且它还扩展了Struts2自带的缺省文件struts-default.xml配置文件,在此基础上可以对Action或其他项目中需要用到的类映射进行自定义。
注意:Actionname一定要写成代码里显示的形式,没必要后面加“.do”或者“.action”这样的后缀名形式。因为.do”是Struts1里定义的Action后缀名形式(当然在web.xml里也可以使用<url-pattern>*.do</urlpattern>来定义或定义成其他后缀名形式),在Struts2里已经废弃不用了。而“.action”不加是因为当系统运行时候其实它会自动搜寻后缀名为“.action”的Action,所以也没必要加。否则就变成搜寻“xx.action.action”这样格式的Action,系统肯定会报错。
另外说一句,虽然Struts2里系统只会搜寻“.action”的Action,但也可以让它只搜寻其他名字的后缀名。在Struts2org/apache/struts2目录下有个default.properties属性文件,其中有个属性名为struts.action.extension,可以将它改为“struts.action.extension=do”,这样就只搜寻“.do”后缀名。如果不想修改Struts2的源文件,也可以用struts.properties,在该文件里加上“struts.action.extension=do”。而且还可以改为“struts.action.extension=dohtm”,这样就不只搜寻“.do,还可以搜寻“.htm”后缀名。当中以“,”隔开就行。
注意:<result></result>之间定义的JSP页面要把全路径写出来,不能只写login.jspsuccess.jsp除非该JSP页面是在系统根目录下。
Struts2中每一具体的Action类其实都是将Struts1中的FormBean类和Action类代码都放在一起,所以看起来就是一个简单的JavaBean类(按照现在流行说法是POJOPlains Ordinary Java Object。无格式普通Java对象)。比如代码中用户名和密码两个变量都是字符串类型变量,使用getset方法可以从JSP页面上得到输入的值内容。
Action类中最主要的方法为execute方法,Struts1中它一共有四个参数。返回一个ActionForward对象。而在Struts2中为了不侵入Servlet的类和方法,同时为了更好的解耦,符合现在Web项目松耦合开发理念,所以这四个参数都已经不用了Struts2中返回的也是一个普通字符串,此字符串内容就是之前所述的导航页面的唯一标识。
注意:之所以操作失败后mapForward赋值为“input”,而不是“error”或“failure”是为了Struts2校验使用考虑,具体原因见下节。
通过Struts2包里自带的ActionContext类来调用,首先先得到当前HTTP应用中内容,然后通过getSession方法得到Sessions对象,但Struts2是用一个map对象来标识,也就是说getSession方法得到是一个Sessions对象封装处理后的结果。所以代码中可以使用putmap的方法,而不是setAttribute方法来将用户名变量值放入session
LoginAction类中继承ActionSupport,此类也是Struts2自带的类之一。该类有一个validate方法,所以继承ActionSupport类的Action子类都可以通过重写此方法来定义自己开发的项目操作失败后的错误提示信息。
注意:Struts2类库里有个BaseAction类,该类也是继承ActionSupport类的。因此也可以在具体Action类代码里,直接继承BaseAction类。比如在LoginAction代码粗体所示处,将“ActionSupport”改为“BaseAction”,这样同样可以重写validate方法,不会产生任何编译错误。
注意:validate方法一般都是Action类执行execute方法之前执行,这样如果操作失败,就直接返回到struts.xml中定义的“input”指向的URL。而“input”指向的JSP页面也正是登录初始页面,如图4.2所示,在登录初始页面显示了错误提示信息。