structs2解决的问题:
利用拦截器的原理,拦截每一个请求,执行相应的action,但是一个action能够处理多个请求,利于项目的管理和维护.
structs2的运行原理:
structs使用拦截器,利用反射的原理,将每一个请求都映射到相应的action中,实现一个action处理多个请求的需求.
* 初步配置:
<struts>
<package name="hellodemo" extends="struts-default" namespace="/">
<action name="hello" class="shen.com.hello.HelloStructs2">
<result name="ok">/hello.jspresult>
action>
package>
struts>
1. 可以在包下新建xxx.xml文件,在其中配置struts,配置跟集中配置相同
2. 在struts.xml中引入xxx.xml文件(include标签)
主要是struts.xml中的action配置,共有3中方法,本人认为第二种通配符的方法较好
1. 在action标签中使用method,配置多个action表实现
<struts>
<package name="hellodemo" extends="struts-default">
<action name="user" class="shen.com.hello.UserAction" method="add">action>
<action name="user" class="shen.com.hello.UserAction" method="delete">action>
package>
struts>
<struts>
<package name="hellodemo" extends="struts-default">
<action name="user_*" class="shen.com.hello.UserAction" method="{1}">action>
package>
struts>
<filter>
<filter-name>struts2filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterfilter-class>
filter>
<filter-mapping>
<filter-name>struts2filter-name>
/*
filter-mapping>
action共有3中 编写方式
package shen.com.hello;
public class HelloStructs2 {
public String execute() {
return "ok";
}
}
package shen.com.hello;
import com.opensymphony.xwork2.Action;
/*
* 实现Action接口
*/
public class UserAction implements Action{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return null;
}
}
package shen.com.hello;
import com.opensymphony.xwork2.ActionSupport;
/*
* 继承AcionSuppert
*/
public class PersonAction extends ActionSupport{
}
优先级是action中的优先级比较高
<package name="hellodemo" extends="struts-default">
<global-result>
<result name="success">/hello.jspresult>
global-result>
<action name="hello" class="shen.com.hello.HelloStructs2">
<result name="ok">/hello123.jspresult>
action>
<package>
1. 声明变量:
private User user=new User();
2. 写get方法
public User getUser() {
return user;
}
3. 为变量赋值
user.setUserName(userName);
user.setPassword(password);
主要是使用ServletActionContext域对象来操作
一种表达式,本身不是struts2的一部分,可以独立存在.
功能如下:** 在struts2中操作值栈,一般ognl在struts2中和struts2标签一起使用操作值栈
使用 **
struts2的一种存储机制,类似于域对象.可以取值和存储
action每次访问的时候都会创建一个action对象,值栈存储于每一个action对象中,只有一个值栈对象.
(1)root,本身是list结构,大多数操作就是root上的操作
(2)context,本身是map结构,大多数是操作不在context上
(1)使用ActionContext
(1)使用set方法,在值栈中分配一个hash的map集合来存放set的变量,不多用.
(2)使用push方法,在值栈顶部push进去,取用不方便,不多用.
(3)使用设置变量,写get变量方法,然后这个变量会被存到值栈中,不用做显示的操作.
值栈中使用第3种方式,可以将对象,list集合,字符串等放入值栈.
在jsp页面中取值栈的内容:
使用ognl表达式
在jsp页面中设置:<%@ taglib uri="/struts-tags" prefix="s" %>
登陆成功:
<s:property value="user.userName"/>
struts2中有很多的拦截器,很多的功能都被封装到了拦截器中,每次执行,都会执行默认的拦截器
拦截器在action对象创建之后,方法访问之前执行.
——-拦截器底层主要有2中思想,aop思想和责任链设计模式
面向切面编程,就是在增加功能的情况下不修改源代码
有很多的功能,只有一个功能完成之后,经过类似过滤器next方法之后,才能执行下一个功能.
过滤器:理论上能够过滤所有东西,html,servlet,图片路径等
拦截器:只是拦截action
继承自MethodFilterInterceptor,重写doIntercept方法,拦截逻辑就在此方法中
拦截器拦截配置
1. 在package标签中设置拦截器
<interceptors>
<interceptor name="logininterceptor" class="com.shen.inteceptor.MyInteceptor">interceptor>
interceptors>
2. 在action中设置拦截器的使用
<interceptor-ref name="logininterceptor">
<param name="excludeMethods">loginVlaueStackparam>
interceptor-ref>
3. 由于2中的设置,导致默认的拦截器都不执行了,很多功能不能实现,所以应当手动执行一次拦截器
<interceptor-ref name="defaultStack">interceptor-ref>