Struts2学习笔记

介绍:struts2是一个基于MVC设计模式的Web应用框架,作为控制器来建立模型与视图的数据交互

核心:Interceptor , Action , OGNL 和 valuestack

Struts2快速入门

1). 导入jar包

2). 在web.xml中配置 StrutsPrepareAndExecuteFilter(核心控制器)

3). 创建struts.xml , 放在src目录下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts> 

<package name="default" namespace="/" extends="struts-default">

<action name="doLogin" class="cn.itcast.struts2.LoginAction" method="doLogin">
<result name="success">/success.jsp</result>
<result name="error">/failure.jsp</result>
</action>
</package>
</struts>

4). 创建Action类

接收参数:在Action中定义成员属性,提供get/set方法

页面跳转:Action中的方法增加返回值,返回值与struts中package下的action下的result标签中的name属性对应

Struts2执行流程

1). 浏览器发送请求

2). 被web.xml中配置的 StrutsPrepareAndExecuteFilter 拦截

3). 调用struts2默认的Interceptor完成部分功能

Struts2中的默认拦截器,是在struts-default.xml中配置的

默认的拦截器在defaultstack中配置的

4). 执行对应的Action中的操作

5). 根据Action中返回结果,决定转跳的页面

配置文件加载顺序

1). default.properties
位置:struts2-core.jar中的org.apache.struts2包下
作用:声明了Struts2框架的常量
2). xml配置文件
struts-default.xml位置:struts2-core.jar  作用:定义了框架的interceptors , bean , result ,在其中声明了默认的拦截器,默认的Action
struts-plugin.xml 位置:在对应的插件jar包中定义 作用:用于插件中的配置声明
struts.xml 位置:在自己的工程中定义 作用:用来声明框架常量, package , action , result等配置
3). struts.properties 位置:自己的工程中定义  作用:用来定制常量
4). 自定义配置
5). web.xml中配置的struts的相关配置
6). bean的相关配置


配置文件介绍
package配置
name: 定义一个名称,必须唯一
namespace:主要是与action标签的name属性联合起来确定一个action的访问路径
extends:指定继承自那个包, 一般值为 struts-default
abstract:代表当前包是否是抽象的,是否可以被继承
action配置
name:与package中的namespace联合起来确定action的访问路径
name:与package中的namespace联合起来确定action的访问路径
method:用于指定当前的action类的执行方法
result配置
name:action中的方法返回值与该name进行匹配,来确定跳转路径
type:指定跳转方式
1). dispatcher : 请求转发。针对于jsp页面
2 ). redirect : 重定向   针对于jsp页面 
3 ). chain : action请求转发,只不过它是针对于action跳转.
如果是在当前的package中转发:

则直接在result的标签之间写转发的action的name, <result name="chaintest" type="chain">strutsTest</result>
如果转发到其他的package:


<result name="chaintest" type="chain">
<param name="namespace">/day_01</param>
<param name="actionName">strutsTest</param>
</result>


4 ). redirectAction : action重定向  针对于action
<result name="redirectActionTest" type="redirectAction">
<param name="namespace">/day_01</param>
<param name="actionName">strutsTest</param>
<param name="method">test2</param>
</result>


method参数可以不指定。


注意: 如果为重定向action , 指定了method,则需要打开动态方法调用的开关。


5). freemarker:处理FreeMarker模板
6). httpheader:用来控制特殊的Http行为
7). stream:向浏览器发送InputSream对象,通常用来处理文件下载
8). velocity:处理Velocity模板
9). xslt:处理XML/XLST模板
10). plainText:显示原始文件内容,例如文件源代码
框架默认值
Action: ActionSupport
Method:execute
result中的type属性:dispatcher
result的name属性: success
常量配置(后加载的配置文件中的常量,会覆盖先加载的常量)
1). src下创建一个struts.properties文件
2). 在web.xml文件中配置
3) . struts.xml文件中定义(推荐):<constant name="struts.action.extension" value="action"></constant>




Action详解
创建方式
1). 直接创建一个pojo类优点:无耦合 缺点:所有的功能都需要自己来实现
2). 创建一个pojo类,实现Action接口
优点:低耦合,在Action定义了五种Struts视图名称,可以被框架识别
缺点:功能还需要自己完成
3). 创建一个pojo类,继承ActionSupport
优点:耦合度高
缺点:功能丰富,表单验证,国际化,错误信息配置
访问方式
1). 通过package的namespace和action的name属性来确定访问对应Action的对应方法
2). 通过 * 号来匹配访问
3). 动态方法调用, 需要开始开关: <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> 
调用方式: http://localhost:8080/struts2-day01/struts!show.action

Struts2框架数据封装
属性驱动 两种方式
1). 直接在action中定义与请求参数匹配的属性,提供get/set 方法
2). 在action类中创建一个javaBean,对其提供get/set ,在请求时页面上要进行修改 ognl
模型驱动
1). 1.让Action类要实现一个指定接口ModelDriven
2). 2.实例化模型对象
3 ) . 3.重写getModel方法将实例化的模型返回
获取Servlet API
ServletActionContext
1). ServletActionContext.getRequest()
2). ServletActionContext.getResponse()
注入方式(该功能有拦截器完成 : ServletConfigInterceptor)
1). 自己编写的Action类实现ServletRequestAware接口 ,定义request属性, 实现方法
public class LoginAction1 extends ActionSupport implements ServletRequestAware{


private HttpServletRequest request;

@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
2). 自己编写的Action类实现ServletResponseAware接口 , 定义response属性,实现方法
OGNL表达式
概念: Object-Graph Navigation Language - 对象图导航语言,是一种功能强大的表达式语言,可以存取对象的任意属性,调用对象的方法
作用
1. 支持对象的操作,调用对象的方法
OgnlContext context = new OgnlContext();


Object value = Ognl.getValue("\"Hello World\".length()", context, context.getRoot());
2. 支持静态成员访问
OgnlContext context = new OgnlContext();
Object value = Ognl.getValue("@java.lang.Math@random()", context,context.getRoot());
System.out.println(value);

Object value2 = Ognl.getValue("@java.lang.Math@PI", context, context.getRoot());
System.out.println(value2);
3. 支持赋值操作与表达式串联
OgnlContext context = new OgnlContext();

User user = new User();
user.setUserName("Tom");
user.setGender("male");
context.setRoot(user);

Object value = Ognl.getValue("userName='Hello' , gender='female'", context, context.getRoot());
System.out.println(user.getUserName() + "    " + user.getGender());
4. 访问OGNL上下文
#username: 使用#代表的是从非根中获取数据
username:#代表的是从根中获取数据
5. 操作集合对象
OgnlContext context = new OgnlContext();

Object value1 = Ognl.getValue("{1,2,3,4}", context, context.getRoot());
System.out.println(value1);
System.out.println(value1.getClass());

Object value2 = Ognl.getValue("#{'userName':'Tom','gender':'male'}", context, context.getRoot());
System.out.println(value2);
System.out.println(value2.getClass());
struts2中的使用:ognl主要用于从ValueStack中获取数据,并在页面上通过struts2标签在jsp页面上显示
1). 引入struts2的标签库
2). <s:property value="ognl表达式">


ValueStack值栈
ValueStack介绍
作用:ValueStack主要是将action中的数据,携带到页面上,实际上值栈就是一个容器
接口: ValueStack
常用实现类:OgnlValueStack
线程安全:一个request请求,一个action实例,一个valueStack对象
ValueStack内部结构
CompoundRoot root : 是一个ArrayList集合,主要存储action的相关数据
Map<String,Object> context : 是一个Map集合,存放的是一些web的相关信息,如: request , response , session , application,parameters等信息
数据获取
不使用#号:从CompoundRoot中获取数据
使用#号:从context中来获取
获取ValueStack的方式
request对象获取: ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY))
ActionContext获取:ActionContext.getContext().getValueStack()
ActionContext
概述: action上下文,strtus2框架它使用actionContext来保存Action在执行过程中所需要的一些对象
获取方式: ActionContext.getContext()
一个request请求, 对应一个ActionContext ,对应一个action实例,对应一个ValueStack
ValueStack存储数据(我们使用ValueStack来存储数据时, 主要是往root中存储。)
手动存储 
1) . valueStack.push(value) : 往root中添加数据
2) . valueStack.set(key , value) : 数据封装为map,然后添加到root中
框架自动存储
1) . 每次请求Action , 都会将action存储在valuestack中
2) . 请求参数封装的model,会存储在valueStack中
ValueStack获取数据
1). 通过序号获取
[ 0 ] : 获取的是序号从0开始的所有的数据
[ 0 ].top : 获取数据序号为0的数据
2). 直接通过名称获取(Map结构)
3). model.username : 从action的模型对象中来获取数据
4). 获取数据时, 可以借助于<s:debug/> 标签, 来查看ValueStack的结构
EL表达式获取ValueStack
1). EL 表达式获取数据时, 默认的会从page , request , session , application 中获取数据
2). 而Strtus2中对request的进行了增强,对其getAttribute(...)方法进行重写,如果从域对象中找不到数据,会从ValueStack中获取数据
OGNL的特殊符号
# 号 : 是从非root中获取数据 , 不带#表示从root中获取
% 号:强制是否要解析ognl表达式 , 带上%表示需要解析 , %{'#request.username'}
$ 号:从配置文件中来获取valueStack中数据
ValueStack练习
<s:iterator value="ps" var = "p">
<s:property  value="#p.name"/>
</s:iterator>
错误操作处理
1). addActionError(errorMessage) : <s:actionerror/>
2). addFieldError(fieldName, errorMessage) : <s:fielderror/>
3). addActionMessage(aMessage) : <s:actionmessage/>


Interceptor拦截器
拦截器介绍
概述:interceptor它是基于spring aop思想,是通过动态代理来实现
作用:strtus2的拦截器它主要是拦截Action的操作,在action的执行前或执行后进行一些功能操作
自定义Interceptor
1). 实现 Interceptor 
2). 继承AbstractInterceptor
3). 继承MethodFilterInterceptor
Interceptor的配置
xml中配置
<interceptors>
<interceptor name="loginInterceptor" class="cn.itcast.LoginInterceptor"></interceptor>
<interceptor-stack name="myInterceptorStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="loginInterceptor"/>
</interceptor-stack>
</interceptors>
配置 : action 中通过 <interceptor-ref name="myStack"/> 引用
注意: 如果我们使用了自定义的拦截器 , 那么 struts2中默认的拦截器栈 defaultStack 就不会执行了, 需要手动的引入

文件上传
页面设置
1). method=post
2). <input type=”file”name="upload">
3). enctype=”multipart/form-data”
服务器端
1). File upload
2). String uploadFileName
3). String uploadContentType
设置上传文件的大小 : <constant name="struts.multipart.maxSize" value="20971520"/>
修改uploadInterceptor的配置
<interceptor-ref name="fileUpload">

<!-- 设置每一个action允许的上传文件大小 -->
<param name="maximumSize"></param>

<!-- 设置上传允许的文件的mimeType类型,多个使用逗号分开  -->
<param name="allowedTypes"></param>

<!-- 设置上传文件允许的后缀名,多个使用逗号分开 -->
<param name="allowedExtensions">bmp,txt</param>
</interceptor-ref>


<interceptor-ref name="defaultStack"/>
多文件上传
1). File[ ] upload
2). String[ ] uploadFileName
3). String[ ] uploadContentType
对json的支持
json数据
[vaule1,value2...] : 它本质上就是一个javascript的数组
{name:value,name1:value1....} :它本质上就是javascript中的对象。
fastjson 使用
1). 将java对象转为json字符串 : JSONObject.toJSONString(user)
2). 将集合转为json字符串 : JSONArray.toJSONString(list)
3). 将json字符串转为java对象 : JSONObject.parseObject(jsonstr, User.class);
4). 将json字符串转为List集合 : JSONArray.parseArray(jsonarr, User.class);
5). @JSONField
jackson 使用
1). 将对象转为json字符串 : objectmapper.writeValueAsString(...)
2). 将json字符串转为java对象 : objectmapper.readValue(jsonstr, Product.class);
3). 将json字符串转为集合 : mapper.readValue(jsonstr, javaType);
JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, Product.class);
4). @JsonIgnore : 忽略属性 , 定义在属性上
5). @JsonIgnoreProperties({ "id", "releaseDate" }) : 忽略那些属性, 定义在java类上
Struts2对ajax的支持
HttpServletResponse响应数据 : response.getWriter().write(jsonstr) , 直接将json字符串输出
Struts2框架json插件
1). 导入fastjson.jar包
2). 修改action所在的package的extends属性为插件包中声明的package的name值json-default
3). 将返回的数据压入值栈ValueStack
4). 当前的action中声明result,name为方法返回值,type为json
<result name="success" type="json">
<param name="root">plist</param>
<param name="encoding">UTF-8</param>
</result>
5). 在result中配置属性信息,如 root , excludeProperties , includeProperties
<result name="success" type="json">
<param name="root">ps</param>
<param name="excludeProperties">\[\d+\]\.releaseDate</param>
<param name="includeProperties">ps\[\d+\]\.id,ps\[\d+\]\.name</param>
</result>
注解开发
加入jar包 : struts2-convention-plugin-2.3.24.jar
常用注解
@Namespace : 来代替<package  namespace=””>
@ParentPackage : 来代替<package extends=””>
@Action : 来描述关于<action>配置 , 使用@Action的results属性来描述关于结果类型的配置<result>
@Action(value="sayHello",results={@Result(name="success",type="dispatcher",location="/success.jsp"),
@Result(name="failure",type="redirect",location="/failure.jsp")})
@Result :来替代<result></result>, 使用其中的params属性来替代xml中的<param></param>
@Actions : 可以通过多个映射来访问同一个action
@Results : 相当于<global-results></global-results>
注解扫描配置
默认扫描路径: <constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>
自定义扫描路径:就可以在struts.xml重新配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值