Struts2一个mvc框架 采用拦截器机制来处理用户的请求。
1、引入13个jar包到web项目的lib文件夹下面
每个jar包都有着不同的作用,附图有详解
注意commons-lang要引入3.0以上的版本,不然启动的时候回报错
2、拦截器配置
struts2的核心就是拦截器
怎么配置拦截器呢?
在web.xml里面配置,
<!--拦截器在工作 -->
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.Struts2PrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
注意:
<filter-name>struts2</filter-name>中的struts2可以是任何名称,但是要和下面的 <filter-mapping>里面的<filter-name>一致
当然,由于做项目的时候程序比较复杂,struts2这个名称比ssh这个名称更有辨识度!
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
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_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--拦截器在工作 -->
<filter>
<filter-name>ssh</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ssh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3、Action类
-
1
这个类继承了ActionSupport类,ActionSupport类好处很多,以后会重点解释
但是这个类在这里是没有起到什么作用的!
看这个类,我们要知道,这个类的包名、方法名,返回的是yes就可以了
package cn.com.day01; import com.opensymphony.xwork2.ActionSupport; public class ActionSupportClass extends ActionSupport{ /** * */ private static final long serialVersionUID = 1L; /*author:命运的信徒 * date:2019/3/9 * arm:了解struts2的运作流程 */ public String helloworld(){ System.out.println("Action类执行了"); return "yes"; } }
4、struts.xml文件的配置
-
1
struts.xml直接放在src的根目录下面就可以了
基础模板如下
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "struts-2.1.7.dtd" > <struts> <!-- 设置后缀名为action --> <constant name="struts.action.extension" value="action"> </constant> <package name="tjn" namespace="/" extends="struts-default"> <action name="hello" class="cn.com.day01.ActionSupportClass" method="helloworld"> <result name="yes">/succese.jsp</result> </action> </package> </struts>
5、我们开始讲struts.xml里面的配置字段
5.1、<constant name="struts.action.extension" value="action"></constant>
的意思就是设置Action请求的后缀名为action,
什么意思?
当前台的一个请求,如hello.action,hello.kk,struts.xml只识别.action后缀名的为我这个配置文件的请求,其他的不是!
当然字段的配置可以放在src下面的一个struts.properties文件夹里面
也可以放在web.xml的init-param里面,
三种字段的配置,一般都是把字段放在struts.xml文件里面配置
附图为其他的配置字段的样式,三选一就可以了!
5.2、<package name="tjn" namespace="/" extends="struts-default"</package>
name="tjn"是包名,因为到后来项目的复杂,一个struts.xml中有多个package
所以name是唯一的标识符
namespace是命名空间,没什么用处
extends是继承的意思,一般都是继承struts-default,这个struts-default里面有许多的拦截器机制
也可以继承其他的包名!
5.3、<action name="hello" class="cn.com.day01.ActionSupportClass" method="helloworld"></action>
这个action中name="hello"对于的就是前台页面jsp中的请求的名称
如 <a href="hello.action">点我</a>
class就是要处理用户请求类的地址,一般ctrl+鼠标点击就可以进去
method就是这个类里面的方法
如果没有method,默认方法名是execute
5.4、<result name="yes">/succese.jsp</result>
name是类中的方法返回的字符串,如果没有name="yes"的话,默认返回的是success
/success.jsp:如果类中的方法返回的字符串==success的话,执行成功的话,页面就会跳转到success.jsp页面
6、前台页面jsp
<a href="hello.action">点我</a>
页面效果如下
7、struts执行的流程
1、当web项目启动的时候,StrutsPrepareAndExecuteFilter机制就开启了;
2、当前台页面jsp发送一个httpservlet请求的时候,可以是
<a href="success.jsp"></a>
或<a href="hello.action">点我</a>
或<a href="/项目名/LoginServlet">点我</a>
3、这一切都有ActionMapping来判断是不是Action请求,不是的话,就直接去http相应,如果是的话,就会把请求处理交给ActionProxy;
4、ActionProxy会通过配置管理器找到struts.xml文件,怎么找相应的action呢?通过创建Action ActionInvocation实例,Action ActionInvocation根据请求的名称<action name="hello"来找到Action类,在调用Action类之前,会经过各类的拦截器机制,这个拦截器机制是核心,后面会有很多的用处;
5、一旦Action执行结束,就会返回一个字符串,Action ActionInvocation就会负责查找result中name和字符串相符的result ,执行result;
6、产生的result信息返回给ActionInvocation,这个过程也会经过拦截器机制
注意:
struts.xml文件可以有多个,但是web项目启动的时候,从前台都后台默认的都是struts.xml文件,如果你想调用struts-demo.xml文件的话,可以在struts.xml文件中包含
<include file="struts-demo.xml"/>
这个写法是默认struts-demo.xml也在src根目录下面