Struts2和Struts1的体系结构差别巨大,Struts2以WebWork为核心,采用拦截器的机制来处理用户请求,这样的设计也使得业务逻辑控制器能够和Servlet API完全脱离开。
一.下载安装Struts2框架
1.http://struts.apache.org,下载Full Distribution最新的Struts2,解压缩后将lib文件夹下的压缩包都放到WEB-INF/lib下
2.web.xml配置:
<?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>
/**定义核心Filter名称 */
<filter-name>Struts2</filter-name>
//filter实现类
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
/* 接受的Web请求 */
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
二.基于Struts2框架实现登陆案例
1.准备工作
①新建Web项目,并通过上述安装struts2框架(文件和web.xml)
②在WEB-INF/classes文件夹下新建struts.xml配置文件
③新建用户登录界面login.jsp,登陆成功界面login_success.jsp,登录失败界面login_failure.jsp和业务逻辑组件LoginCheck.java
④编译业务逻辑组件LoginCheck,使编译后的class文件,包括包名放入项目的WEB_INF文件夹下的classes文件夹中
2.控制类Action
struts2的控制类不同于struts1,不需要继承Action父类,也无需任何接口,是一个普通的POJO类。Action中包含了多个属性用来封装用户请求的参数,和Struts1中的ActionForm非常相似,同时还有一个execute方法,用来调用业务逻辑组件来判断,返回字符串,指定视图资源
//实现Action接口
public interface Action{
public static String SUCCESS = "success";
public static String NONE = "none";
public static String ERROR = "error";
public static String INPUT = "input";
public static String LOGIN = "login";
//定义execute处理请求
public String execute() throws Exception;
}
//登陆Action
import com.yl.test.LoginCheck;
import com.opensympgony.xwork.Action
import com,opensymphony.xwork.ActionContext;
public class LoginAction implements Action{
private String uname;
private String upassword;
//获得uname值
public String getUname(){return uname;}
public void setUname(String uname){
this.uname = uname;
}
public String getUpassword(){
return upassword;
}
public void setUpassword(String upassword){
this.upassword = upassword;
}
public String execute() throws Exception{
//LoginCheck对象
LoginCheck lc = new LoginCheck();
//调用业务逻辑组件判断功能
if(lc.isLogin(getUname(),getUpassword)){
ActionContext.getContext().
getSession().put("login","true");
return SUCCESS;
}else{ return ERROR; }
}
}
//配置Action,struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
//Action必须放在指定包名空间中
<package name="struts2" extends="struts-default">
//定义login的Action类
<action name="login" class="com.yl.test.action.LoginAction">
//定义处理结果和视图资源的关系
<result name="success">/login_success.jsp</result>
<result name="error">/login_failure.jsp</result>
</action>
</package>
</struts>
3.Struts2标签库和输入校验
//导入标签库
<%
@ taglib prefix="s" uri="/struts=tags"
%>
/**登录表单,提交到login.action*/
<s:form action="login">
<s:textfield name="uname" label="用户名"></s:textfield>
<s:password name="upassword" label="密码"></s:textfield>
<s:submit value="登陆"></s:submit>
</s:form>
//继承ActionSupport完成输入校验
//ActionSupport类已经完成Action和Validatable等接口,可以直接继承重写
import com.yl.test.LoginCheck;
import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ActionSupport;
public class LoginAction extends ActionSupport{
private String uname;
private String upassword;
public String getUname(){return uname;}
public void setUname(String uname){
this.uname = uname;
}
public String getUpassword(){
return upassword;
}
public void setUpassword(String upassword){
this.upassword = upassword;
}
//执行输入校验
public void validate(){
if(getUname()==null||"".equals(getUpassword().trim())){
this.addFieldError("uname","需要用户名");
}
if(getUpassword()==null||"".equals(getUpassword().trim())){
this.addFieldError("upassword","需要密码");
}
}
public String execute() throws Exception{
//LoginCheck对象
LoginCheck lc = new LoginCheck();
//调用业务逻辑组件判断功能
if(lc.isLogin(getUname(),getUpassword)){
ActionContext.getContext().
getSession().put("login","true");
return "success";
}else{ return "faliure"; }
}
}
//在struts.xml中加入,输入错误返回登陆页面
<result name="input">/login.jsp</result>
//当然所有的校验工作都可由前台完成,不必那么麻烦