【菜鸟SSH入门详解之Struts2】
目前SSH框架都使用了Struts2,而不使用Struts,所以这里直接跳过Struts,讲解的是Struts2的知识。下面是这篇讲解的目录摘要。
1、Struts2的基本概念
2、Struts2的工作原理
3、Struts2的具体应用
4、Struts2标签库的使用
5、Struts2自定义标签库
一、Struts2的基本概念
1、使用Struts2的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间,Struts2应用程序都是基于client/server HTTP交换协议。
2、Struts2包含了很多参与对所有请求进行处理的关键组件,如:拦截器、OGNL表达式语言、堆栈。
二、Struts2的工作原理
Struts2的工作原理如下图:
一个请求在Struts2框架中的处理大概分为以下几个步骤:
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求。
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)。
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action。FilterDispatcher是控制器的核心,就是MVC中C控制层的核心。
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类,一般是从struts.xml配置中读取。
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。Interceptor的调度流程大致如下:
1)ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。
2)通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper。
三、Struts2的应用
1、在web.xml配置struts2拦截器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> <init-param> <param-name>config</param-name> <param-value>struts-default.xml,struts-plugin.xml,struts.xml</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
2、在struts.xml配置Action信息,若有interceptor,需在Action中引用
1 2 3 4 5 6 7 8 9 10 11 |
<struts> <package name="test" extends="struts-default"> <interceptors> <interceptor name="abc" class ="ceshi.AuthorizationInterceptor"/> </interceptors> <action name="TestLogger" class="vaannila.TestLoggerAction"> <interceptor-ref name="abc"/> <result name="success">/success.jsp</result> </action> </package> </struts> |
3、定义interceptor的处理类
1 2 3 4 5 6 7 8 |
public class AuthorizationInterceptor extends AbstractInterceptor { @Override public Stringintercept(ActionInvocation ai)throws Exception { System.out.println("abc"); return ai.invoke(); } } |
四、Struts2标签库的使用
使用规则较多,可参考下文连接:http://blog.csdn.net/zxl315/article/details/2886456
五、Struts2自定义标签库
1、首先自定义tld标签文件,例如在WEB-INF/tld目录下自定义mytag.tld 标签文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?xml version="1.0" encoding="utf-8"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>mytaglib</short-name> <!-- 自定义标签库uri,与jsp页面引入的taglib一致 --> <uri>http://www.test.org/mytaglib</uri> <tag> <!-- 自定义tag名称 --> <name>mytag</name> <tag-class>test.myTag</tag-class> <body-content>empty</body-content> <attribute> <name>username</name> <required>true</required> <fragment>true</fragment> </attribute> <attribute> <name>age</name> <required>true</required> <fragment>true</fragment> </attribute> <attribute> <name>id</name> <required>true</required> <fragment>true</fragment> </attribute> </tag> </taglib> |
2、自定义tag处理类,需继承SimpleTagSupport类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
public class myTag extends SimpleTagSupport { private String username; private int age; private String id; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } public void doTag() throws JspException, IOException { try{ String word = "名字: " + username + " 年龄: " + (age+100) + " id: " + id; getJspContext().getOut().write(word); } catch(Exception e) { e.printStackTrace(); } } } |
3、JSP页面使用
1 2 3 4 5 |
//引入标签 <%@ taglib uri="http://www.test.org/mytaglib" prefix="mytag" %> //body中标签的使用: <mytag:mytag username="hello" age="20" id="1" /> |