structs2配置步骤(strucs使用的版本是2.3.32)
structs2解决的问题:
利用拦截器的原理,拦截每一个请求,执行相应的action,但是一个action能够处理多个请求,利于项目的管理和维护.
structs2的运行原理:
structs使用拦截器,利用反射的原理,将每一个请求都映射到相应的action中,实现一个action处理多个请求的需求.
1.导入jar包,是从官网上下载的,空白模板中找到的lib中找到的
2.配置structs.xml文件·
集中配置
* 初步配置:
<struts>
<!-- 包配置 -->
<package name="hellodemo" extends="struts-default" namespace="/">
<!-- action配置 method=""执行action的某一个方法名,默认execute方法-->
<action name="hello" class="shen.com.hello.HelloStructs2">
<!-- 跳转页面配置 type="",(dispatcher,redirect转发页面),(chain,redirectAction转发到action)转发或者跳转,默认转发-->
<result name="ok">/hello.jsp</result>
</action>
</package>
</struts>
分模块开发配置
1. 可以在包下新建xxx.xml文件,在其中配置struts,配置跟集中配置相同
2. 在struts.xml中引入xxx.xml文件(include标签)
访问action中的不同方法
主要是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">
<!-- 其中method中大括号中的1是指*号的内容 -->
<action name="user_*" class="shen.com.hello.UserAction" method="{1}"></action>
</package>
</struts>
- 动态方法
3.配置拦截器,在xml中配置
<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>
4.写action(相当于servlet文件)
action共有3中 编写方式
新建类,不继承任何类,不实现任何接口
package shen.com.hello;
public class HelloStructs2 {
public String execute() {
return "ok";
}
}
新建类,实现Action接口
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;
}
}
新建类,继承ActionSupport类
package shen.com.hello;
import com.opensymphony.xwork2.ActionSupport;
/*
* 继承AcionSuppert
*/
public class PersonAction extends ActionSupport{
}
structs2的其他配置
关于页面的配置
优先级是action中的优先级比较高
<package name="hellodemo" extends="struts-default">
<global-result>
<result name="success">/hello.jsp</result>
</global-result>
<action name="hello" class="shen.com.hello.HelloStructs2">
<!-- 跳转页面配置 type=""转发或者跳转,默认转发-->
<result name="ok">/hello123.jsp</result>
</action>
<package>
struts2 页面数据操作
action中获取表单数据
(原始方式)action中获取表单数据
- ActionContext
- servletActionContext
- 接口注入的方式(不多用)
(struts2方式)action中获取表单数据
- 属性封装
- 模型驱动封装(能够将表单数据直接封装带对象中)
1. 声明变量:
private User user=new User();
2. 写get方法
public User getUser() {
return user;
}
3. 为变量赋值
user.setUserName(userName);
user.setPassword(password);
- 表达式封装
封装表单数据到map或者 list中(了解即可)
action中操作域对象
主要是使用ServletActionContext域对象来操作
- request
- session
- servletContext域对象
值栈
ognl概述
一种表达式,本身不是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思想和责任链设计模式
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">loginVlaueStack</param>
</interceptor-ref>
3. 由于2中的设置,导致默认的拦截器都不执行了,很多功能不能实现,所以应当手动执行一次拦截器
<interceptor-ref name="defaultStack"></interceptor-ref>