从整个java开发来讲,2005年是一个分界点,一些旧的开发框架逐步退出主舞台,但是struts2留下来了.从Apache收购了Webwork开始,webwork开始全新发展,但最开始没有太大更新,但随着它不断的发展,积极响应Annotaion的配置过程.
- 要使用Annotation需要有struts2-convention-plugin-2.3.37.jar开发包的支持
- 设置web.xml文件,新版本的struts2之中不需要就能够直接使用注解了.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>AnnotationProject</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>actionPages</param-name> <!-- 设置Anntation扫描包 -->
<param-value>mao.shu.action</param-value> <!-- 所有Action的保存路径 -->
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
核心配置
-
在整个的项目之中最为重要的内容就是Action.但是任何的项目之中都有特殊的需求配置.例如:全局跳转,拦截器定义.
-
定义公共的配置文件信息
-
配置struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="root" namespace="/" extends="struts-default">
<!-- 全局跳转路径-->
<global-results >
<result name="error">/error.jsp</result>
<result name="login">/login.jsp</result>
</global-results>
</package>
</struts>
- 定义Action并且使用Annotaion定义Action相关配置
- 配置Action程序类
package mao.shu.action;
import org.apache.struts2.convention.annotation.Action;
import com.opensymphony.xwork2.ActionSupport;
@Action("HelloAction")
public class HelloAction extends ActionSupport {
public String show(){
return "welcome";
}
}
- 相当于原struts.xml文件之中的
<action name="HelloAction" class="mao.shu.action.HelloAction">
</action>
- 使用Annotation配置父路径
package mao.shu.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import com.opensymphony.xwork2.ActionSupport;
@Action("HelloAction")
@ParentPackage(value="root")//继承自父路径
public class HelloAction extends ActionSupport {
public String show(){
return "welcome";
}
}
- @ParentPackage(value=“root”)的配置相当于原struts.xml文件之中的 extends=“struts-default”
<package name="root" namespace="/" extends="struts-default" >
- 配置Action类的nameSpace,改变Action所在项目的路径位置
package mao.shu.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import com.opensymphony.xwork2.ActionSupport;
@Action("HelloAction")
@ParentPackage(value="root")//继承自父路径
@Namespace("/page/back/")//定义Action类的访问路径
public class HelloAction extends ActionSupport {
public String show(){
return "welcome";
}
}
- 此时如果要访问这个Action程序类,路径可以是: http://localhost:8080/AnnotationProject/page/back/HelloAction
- 在Annotation里面也可以实现跳转的配置
- 为Action配置单独的跳转路径
- 可以同时为一个Action配置多个跳转路径,
package mao.shu.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
@ParentPackage(value="root")//继承自父路径
@Action("HelloAction")
@Namespace("/page/back")//定义Action类所在的路径
@Results(//配置多个跳转路径
value={
@Result(name="success",location="/page/back/list.jsp"),
@Result(name="error",location="/welcom.jsp")
}
)
public class HelloAction extends ActionSupport {
public String show(){
return "welcome";
}
}
- 使用Annotation的配置还是有些好处的.可以为每一个方法单独定义路径
@Actions(
value={@Action("show"),@Action("hello")}
)
public String show(){
return "welcome";
}
-
此时这个方法的访问路径为http://localhost:8080/AnnotationProject/page/back/hello
-
可以发现使用了Annotation之后,struts2的配置更加的灵活.
拦截器配置
- 在struts.properties文件中配置拦截器
<interceptors>
<interceptor-stack name="maoshu">
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
- 在Action进行拦截器的引用,引用拦截器分为两种情况
- 引用单个拦截器
@InterceptorRef(value="timer")
- 引用多个拦截器
@InterceptorRefs(value={
@InterceptorRef(value="timer"),
@InterceptorRef(value="defaultStack")
})
- 在进行拦截器配置的时候可能需要有一些属性.例如:文件上传:
@InterceptorRefs(value={
@InterceptorRef(value="timer"),
@InterceptorRef(value="defaultStack"),
//设置文件上传拦截器,并设置最大上传文件大小为"20M"
@InterceptorRef(value="fileUpload",params={"maximumSize","20971520"})
})
- 实际的开发之中若允许使用Annotation进行配置,最好在struts.xml文件之中配置好之后再使用Annotation进行引用
数据验证
所有的框架本省所提供的炎症处理,都会有一个问题,由于每一个Action都有多业务处理,但是有可能出现方法一需要验证,方法二不需要验证呢个,
- 定义一个Member.java类
package mao.shu.vo;
import java.io.Serializable;
public class Member implements Serializable {
private String name;
private String password;
private Integer age;
private String email;
//...
//getter和setter方法
//...
@Override
public String toString() {
return "Member [name=" + name + ", password=" + password + ", age=" + age + ", email=" + email + "]";
}
}
- 在MessageAction中编写验证处理,当验证出现错误的时候系统会自动找到input页面之中
package mao.shu.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
import com.opensymphony.xwork2.validator.annotations.Validations;
import mao.shu.vo.Member;
@ParentPackage(value="root")//继承自父路径
@Namespace("/page/back")//定义Action类所在的路径
@Action(value="/page/back/MemberAction")
@Results(//配置多个跳转路径
value={
@Result(name="success",location="/page/back/list.jsp"),
@Result(name="error",location="/welcom.jsp"),
@Result(name="welcome",location="/welcome.jsp"),
}
)
@InterceptorRefs(value={
@InterceptorRef(value="defaultStack"),
})
@Validations(
requiredStrings={
@RequiredStringValidator(fieldName="member.name",message="用户名不能为空!"),
@RequiredStringValidator(fieldName="member.password",message="用户名密码不能够为空!"),
@RequiredStringValidator(fieldName="member.age",message="用户名年龄不能够为空!"),
@RequiredStringValidator(fieldName="member.email",message="用户email不能够为空!")
}
)
public class MemberAction extends ActionSupport {
private Member member;
@Action("show")
public String show(){
System.out.println(this.member);
return "welcome";
}
public Member getMember() {
return member;
}
public void setMember(Member member) {
this.member = member;
}
}
- input.jsp页面,因为在struts2中,所有的错误信息都保存在fieldErrors 属性之中,因此可以使用EL表达式输出错误集合
<h1>${fieldErrors }</h1>
- 访问http://localhost:8080/AnnotationProject/page/back/MemberAction
- 进一步修改,进行正则验证
- 其中"key"为i18n国际化配置文件中匹配的key
@Validations(
requiredStrings={
@RequiredStringValidator(fieldName="member.name",message="用户名不能为空!"),
@RequiredStringValidator(fieldName="member.password",message="用户名密码不能够为空!"),
@RequiredStringValidator(fieldName="member.age",message="用户名年龄不能够为空!"),
@RequiredStringValidator(fieldName="member.email",message="用户email不能够为空!")
},
regexFields={
@RegexFieldValidator(fieldName="member.mid",regexExpression="\\d+",key="validate.int.error"),
@RegexFieldValidator(fieldName="member.email",regexExpression="\\w+@\\w+\\.\\w",message="请输入正确的邮箱信息"),
}
)
- 但是后台会出现这样的错误,这种错误还未能够解决,所以开发的时候很少会使用Annotation进行验证