一、基本原理
1. 问题
如果是前端的静态HTML,处理网页设计的美术人员可以独立设计
如果是后端的类,程序设计人员可以独立设计而结合HTML与Java代码的JSP,处理网页设计的美术人员与程序设计人员,必须被彼此加入至视图组件中的逻辑互相干扰,开发一个JSP页面,需要双方不断交流才能够完成,开发人员的学习负担重,他们必须一人了解多个角色的工作以及相关技术。
2. 解决
Struts它试图在不同的角度上提供网页设计人员、应用程序设计人员、架构设计人员解决方案,让不同技术的人员可以彼此合作又不互相干扰。从架构设计人员的角度来看,他只需要做出一些配置与定义,定义后端bean与前端页面的关系。从网页设计人员的角度来看,Struts提供了一套像是新版本的HTML标签,但它不是静态的,而是动态的,可以与后端的动态程序结合,但网页设计人员不需要理会后端的动态部份。从应用程序设计人员的角度来看,他只需要按架构师设计人员的定义,完成后端bean的实现即可。
3. 总的来说,struct就是为了解决前台设计人员与应用程序设计人员的各自工作的解耦,尽量让另一方的工作不影响到另一方工作。
二、使用
1. 添加jar包
注:struct-spring-plugin.jar这个包是负责struct与spring进行交互,这个包是spring提供的,spring提供的这个jar包是有严谨的版本要求,spring决定是哪一个版本的struct
2,配置web.xml: 配置struts引擎
<?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>
3,添加struts.xml到src根目录
<?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> <package name="demo_struts2" extends="struts-default"> <action name="UserLogin" class="demo.mystruct.UserAction"> <!-- 定义处理结果和资源之间映射关系。 --> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> <result name="input">/index.jsp</result> </action> </package> </struts>
所定义的action都是在package标签里面,例如:
在struts.xml中定义一个action
<action name="UserLogin" class="demo.mystruct.UserAction"> <!-- 定义处理结果和资源之间映射关系。 --> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> <result name="input">/index.jsp</result> </action>
4.按struts.xml中的action定义撰写一个简单的Action类,demo.mystruct.UserAction定义两个用户输入的属性(也就是页面会传过来的参数,注意页面的name要和该类对应的属性要一致),提供getter/setter,定义处理用户请求的execute方法。运行的流程是:页面使用到action--->通过web.xml的struct引擎进行过滤---->找到struct.xml,查询对应的action所对应的定义处理----->找到对应的类,执行execute方法,根据execute方法返回的内容进行跳转那个页面(跳转页面是由action定义的)。
处理类execute方法的写法
public String execute() throws Exception {
// 当用户请求参数的username等于admin,密码请求参数为12345时,返回success字符串
// 否则返回error字符串
f ("11".equals(getName()) && "22".equals(getPass())) {
ActionContext.getContext().getSession().put("userinfo", getName());
System.out.println(this.SUCCESS);
return this.SUCCESS;
} else if(getName() == null || getName().trim().equals("")||getPass() == null || getPass().trim().equals("")){
return this.INPUT;
} else
return this.ERROR;
}
Struts2的工作机制:
一个请求在Struts2框架中的处理大概分为以下几个步骤:
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。