strust2是 struts1和webwork的结合 (本质相当于servlet)
核心:拦截器 interceptor
action
ognl和valuestack
使用struts的准备工作:
1.导入相对应的jar包 (struts2中的lib下的jar包)
2.在web.xml内进行配置filter(只有配置了filter才可以使用struts2框架)
进行配置 StrutsPrepareAndExecuteFilter
3.配置我们的struts.xml文件 (放于根目录下) (可以在struts的zip包中 抽出出来struts.xml文件 然后自己进行修改)
4.创建相应的action进行操作
流程:当我们发送请求的时候,会被我们在web.xml中配置的拦截器进行拦截 会根据请求的路径在struts.xml中进行判断,在根据所对应的method执行性对应的方法.
struts.xml配置信息
<package name=" " namespace="" extends="struts-default">
<action name=" " class=" " method=" ">
<result name=" ".>返回值 //当我们在action中返回一个字符串是 会根据返回的值进行匹配 进行页面跳转
配置剖析:
package:
name : 包名, 必须唯一
namespace: 主要去action中的name属性进行联合,来确定一个action的访问路径
extend:指定继承于哪个包,一般都是 struts-default
abstruct:代表当前包是一个抽象包
action:
name: 与package中的namespace进行联合
class:指示当前的action类
method:指示当前类中的指定执行方法的执行方案
result:
name:与action中的返回值进行匹配 来确定要跳转的路径
type:指定我们当前的要跳转的跳转方式
result的name属性默认值是success,
默认的跳转方式是请求转发 dispatcher
定义常量
在struts.xml文件中进行配置
<constant name=" " value=" ">
注:后加载的配置常量会将先加载的配置常量进行覆盖
ACTION的创建
1.pojo
2.实现action
3.继承actionsupport //具有丰富的功能,不过耦合性比较高
STRUTS2的封装数据
1.属性驱动
a.直接在action类中提供与请求参数匹配属性,提供get/set方法
b.在action类中创建一个javaBean,对其提供get/set ,在请求时页面上要进行修改,要在当前action中使用ognl表达式
2.模型驱动 //缺点:只能对一个模型进行实例化
步骤1.action实现modelDriven<类名> 接口
步骤2.实例化模型(new )
步骤3.重写getModel方法,并将我们实例的对象进行返回
struts2中获取servletAPI
1.servletActionContext进行获取
2.采用注入方式
ServletRequestAware, 实现这个接口可以获取HttpServletRequest
ServletResponseAware ,实现这个接口可以获取HttpServletResponse
ServletContextAware 实现这个接口可以获取ServletContext
OGNL表达式
OGNL作用:
支持对象的操作,调用对象的方法
支持静态成员访问
支持赋值操作与表达串联
访问OGNL上下文,访问ActionContext
操作集合对象
三要素:
表达式
ognlContext上下文 new OgnlContext()
root根
获取数据
在root根中获取数据时 ,ognl表达式前不需要加 #, 如果不是在root根中进行获取数据,则需要添加 #
使用ognl
在struts2中可以使用ognl+valueStack可以实现在页面上获取数据
在页面中进行配置
<%@ taglib prefix="s" uri=" /struts-tags" %>
<s:property value=”表达式”>来使用
valueStack
valuestack的使用的主要目的是为了将action中产生的数据传递到页面上
struts2中的action是多例的,每一次请求都会创建一个action,一个valuestack对应一个action,valuesta贯穿整个action的生命周期
struts2框架将valuestack保存在 request中
主要由两部分组成:
CompoundRoot: 是一个list 主要存储的是action的相关数据
Map<String,Object> context: 是一个map集合 主要引用web开发中的相关信息
获取valuestack中的数据
根据ognl表达式进行获取数据 如果前面添加# 在context中进行查找,如果没有添加# ,代表在CompoundRoot中进行获取数据,也就是所说的root中
1.直接通过request对象进行获取 //因为valuestack存于request中
servletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY)
2.使用actionContext进行获取
ActionContext.getContext().getValueStack();
ActionContext
是action的上下文,struts2框架使用actionContext进行保存action在执行过程中所需要的一些对象
Struts2会根据每一次的http请求来创建对应的ActionContext,它是与当前线程绑定的。
每一次请求,就是一个线程,对应着一个request,每一次请求,会创建一个Action,每一个action对应一个ActionContext.每一次请求也对应着一个valueStack.
request---ActionContext----Action-----ValueStaci它们都对应着一次请求(一个线程).
valueStack与ActionContext本质上是可以获取
存储数据
//主要向root中进行存储
1.手动存储
valueStack.set("key","value")
valueStack.push()
2.自动存储
3.声明成员变量 提供get方法 为了使用属性封装也提供set方法
获取数据
在标签中可以通过 value="key" 或 value="[index].top"
底层是栈. 先进后出
在action中的属性的get方法中 也可以将数据返回
使用模型驱动
在访问路径添加属性的赋值
使用el表达式也可以获取数据 struts2 对 request 里面的 getattribute方法进行了增强
//个人理解: 如果对数据提供了get/set方法 那么就相当于属性存储,要使用ognl进行获取时,应该使用 对象名.属性名 进行获取
传递数据 前提:继承了actionsupport
struts.xml文件中,用来传递数据 (在重定向中) <s:actionerror/> : 错误显示标签
在struts2中处理简单的信息 (字符串)
this.addActionError
this.addFieldError
this.addActionMessage
Interceptor拦截器
主要的作用是为了拦截 action 的操作,在action的执行前后进行一些我们想要做的操作
自定义拦截器
1.在配置文件中 声明 interceptor
2.创建一个类实现 interceptor接口
3.在action中使用interceptor ,action必须继承actionsupport
4.在action的配置中,引入自定义 interceptor
interceptor指定拦截action
Interceptor的放行: return invocation.invoke();
在我们的配置文件中的interceptor里面
<param name="includeMethods">方法名
<param name="encludeMethods">方法名
文件上传
上传前提
浏览器
表单提交方式 : method=post
表单中的组件: <input type="file">
表单中必须设置: enctype=" multipart/form-data"
服务器
导入 Commons-fileupload.jar包
上传操作
在上传的action中进行设置
private File upload; //上传的文件
private String uploadContextType;//文件上传的mimetype类型
private String uploadFileName; //上传文件的名称
操作:
得到该文件的绝对路径
String path=ServletActionContext.getServletContext().getRealPath("/upload");
创建服务端文件
File dest=new File(path,uploadFileName)
完成文件上传
FileUtils.copyFile(upload,dest)
可能会出现的问题:
上传文件过大
在struts.xml配置文件中进行配置
<constant name=" struts.multipart.maxSize" value="自定义的你要上传的文件的最大值">