struts2简单介绍
struts2是一个相当强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架。它继承了struts1和webwork2的优点,同时做了相当的改进。
首先,去Struts官网(http://struts.apache.org),下载需要的版本,小编下载的是struts-2.3.28.1-all.zip。
解压struts-2.3.28.1-all.zip之后,我们来看一下里面的内容:
创建一个Web Project项目,并导入一些基本jar包:
commons-fileupload:处理文件上传组件
commons-io:fileupload上传使用
commons-logging:ASF出品的日志包
ognl:Object-Graph Navigation Language,对象图导航语言,struts2框架通过其读写对象的属性
struts2-core:struts2核心ja类库
xwork-core:XWork类库,struts2在其上构建
freemarker:struts2的UI标签的模板使用Freemarker编写
Struts2实例:
web.xml:配置过滤器StrutsPrepareAndExecuteFilter
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<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>
</web-app>
</span></span>
Action类继承ActionSupport,写界面实体和返回参数。默认执行execute()方法,返回相应的字符串,Struts.xml根据返回的字符串跳转至相应页面。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">public class LoginAction extends ActionSupport
{
private String username;
private String password;
private int age;
private Date date;
public int getAge()
{
return age;
}
public Date getDate()
{
return date;
}
public void setDate(
Date date)
{
this.date = date;
}
public void setAge(
int age)
{
this.age = age;
}
public String getUsername()
{
return username;
}
public void setUsername(
String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(
String password)
{
this.password = password;
}
public String execute(){
return SUCCESS;
}
}
</span></span>
Struts.xml:放在src下,配置action对应的转向页面。将其放在src下,部署的时候,会自动发布到WEB-INF/classes目录下,也可以直接创建在WEB-INF/classes目录下。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><?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>
<!--一个package可以包含多个action,一个Struts可以包含多个package -->
<!--package起到分类的作用,支持继承 -->
<package name="struts2" extends="struts-default">
<action name="login" class="com.jmj.struts2.LoginAction">
<result name="success">/login_success.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
</span></span>
Struts.xml继承了struts2的struts-default.xml中的内容。
JSP
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><!--action名称和struts.xml中的action的name一样 -->
<form action="login">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
年龄:<input type="text" name="age"><br>
日期:<input type="text" name="date"><br>
<input type="submit" value="登陆">
</form></span></span>
显示页面
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<!--使用ognl获取信息 -->
用户名:<s:property value="username"/><br>
密码:<s:property value="password"/><br>
年龄:<s:property value="age"/><br>
日期:<s:property value="date"/><br>
</body>
</html></span></span></span>
Struts2的优点:
1、良好的架构和设计
2、可重用、模块化、扩展性好
3、Open source
自定义拦截器
自定义拦截器必须实现interceptor接口,并覆盖init()、destroy()、intercept()方法。AbstractInterceptor实现了interceptor接口,也可以直接让拦截器类继承此抽象类。继承此类后,可以不用覆盖init()、destroy()方法,只需要覆盖intercept()方法即可。
自定义拦截器类完成后,需要在struts.xml中配置:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><packagename="struts2" extends="struts-default">
<interceptors>
<interceptorname="theInterceptor1" class="com.jmj.interceptor.TheInterceptor1"> <!—自定义拦截器的名称和全路径-->
<paramname="test">shengsiyuan</param> <!—拦截器传递的参数,如果没有参数,可以不写这段代码 -->
</interceptor>
</interceptors>
<!--在action中引用拦截器-->
<action name=”login” class=”com.jmj.struts.LoginAction”>
<interceptor-ref name=” theInterceptor1”/>
</action>
</package></span></span>
如果struts.xml中配置了自定义拦截器,则默认的拦截器将会失效,若还想使用默认拦截器,则可以加上<interceptor-ref name=”defaultStack”/>,且必须要将自定义拦截器放在默认拦截器前面。
Struts.xml中还可以配置拦截器栈,拦截器栈可以引用多个拦截器,也可以引用其他拦截器栈。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><interceptor-stack name=”myInterceptorStack”>
<interceptor-refname=” theInterceptor1”/>
<interceptor-ref name=”defaultStack”/>
</ interceptor-stack></span></span>
Action中引用拦截器栈和引用拦截器是一样的。
还有一种拦截器---方法拦截器,需要继承MethodFilterInterceptor抽象类,此拦截器根据方法名进行拦截,需要覆盖doIntercept(ActionInvocation invocation)方法。
Struts.xml中配置需要拦截的方法和不拦截的方法:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><interceptor-refname=”theInterceptor3”>
<param name=”includeMethods”>execute</param>
<param name=”excludeMethods”>myExecute</param>
</interceptor-ref></span></span>
注:在方法过滤拦截器中,如果既没有指定includeMethods参数,也没有指定excludeMethods参数,则所有的方法都会被拦截;如果仅仅指定了includeMethods参数,则只会拦截includeMethods中的方法,没有包含在includeMethods中的方法就不会被拦截。
注解(Annotation)
Struts2若想使用注解,需要引入struts2-convention-plugin-2.2.1.1.jar。
注解配置在相应的Action类中:
@ParentPackage("struts-default") //指定父包
@Action(value="login",results={@Result(name="success",location="/result.jsp"),@Result(name="input",location="/error.jsp")}) //配置action,如果想要指定多个result,需要使用“{}“括起来,result之间用逗号分隔。
@InterceptorRef("defaultStack") //使用拦截器
@ InterceptorRefs({@InterceptorRef("theInterceptor1"), @InterceptorRef("defaultStack")}) //多个拦截器使用”{}”括起来,拦截器之前用逗号分隔
@ExceptionMappings({@ExceptionMapping(),@ExceptionMapping()}) //指定异常,多个异常处理使用“{}”括起来,异常处理之间用逗号分隔
注:若注解和配置文件冲突,则以注解为准。
异常处理
异常类需要继承Exception抽象类。
Struts.xml中配置异常类:
<global-exception-mapping> //全局异常
<exception-mapping result=”名称(自定义)” exception=”异常类全路径”> //局部异常
注:局部异常优于全局异常。
另外,action中的result也可以定义成全局的,使用<global-result>即可。
数据校验器
Struts2提供了大量的数据校验器,包括字段优先校验器和校验器优先校验器。
字段优先校验器
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><validators>
<field name=”username”>
<field-validator type=”requiredstring”> <!--必填项-->
<message>用户名不能为空!</message>
</field-validator>
<field-validator type=”stringlength”> <!—字符串长度-->
<paramname=”minLength”>4</param>
<paramname=”maxLength”>6</param>
<message>用户名长度介于${minLength}和${maxLength}之间</message>
</field-validator>
</field>
<field name=”age”>
<field-validator type=”required”> <!--必填项-->
<message>年龄不能为空!</message>
</field-validator>
<field-validator type=”int”> <!—数值型-->
<paramname=”min”>10</param>
<paramname=”max”>40</param>
<message>年龄介于${min}和${max}之间</message>
</field-validator>
</field>
</validators></span></span>
Requiredstring和required的区别就是requiredstring可以有空格字符串。另外,还可以校验日期(设置type=”date”)、邮件(设置type=”email”)、网址(设置type=”url”)等等。
校验器优先校验器
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><validators>
<validator type=”requiredstring”> <!--必填项-->
<paramname=”fieldName”>username</param>
<message>用户名不能为空!</message>
</validator>
<validator type=”stringlength”> <!—字符串长度-->
<paramname=”fieldName”>username</param>
<paramname=”minLength”>4</param>
<paramname=”maxLength”>6</param>
<message>用户名长度介于${minLength}和${maxLength}之间</message>
</validator>
</validators></span></span>
以上是struts2的简单使用,Struts2的深入学习有待继续。