【石家庄校区】Struts2框架知识详解 框架介绍 框架(framework)是一个基本概念上的结构,用于去解决或者处理特定领域的复杂问题
特点
半成品,在框架基础上开发。速度快,代码比较规范
方便协同开发,易于调试bug
重用代码大大增加,软件生产效率和质量也得到了提高
使用框架开发,它提供统一的标准,大大降低了我们的后期维护
常用框架
SSH:struts2 spring hibernate
SSM(SSI):springmvc spring mybatis(ibatis)
Javaweb中MVC
Model -- javabean
View -- jsp
Controller -- servlet
Struts2:基于MVC设计模式的web应用框架,本质同一个Servlet,在MVC中Structs2所谓控制器Controller来建立模型与视图数据交互
基本使用步骤
1.导入jar:apps中blank项目拷即可
2.web.xml配置过滤器拦截所有页面
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
3.struts.xml(放在工程src目录下)配置<package><action><result>
4.Action中写逻辑
Struts2框架执行流程(重点)
源码文件
核心源码 org.apache.struts2xx,src\core\src\main\java
xwork核心源码 src\xwork-core\src\main\java\com\opensymphony\xwork2
插件源码 src\plugins
执行流程
1.浏览器请求action
2.StrutsPrepareAndExecuteFilter过滤器拦截请求(称为前端控制器,核心控制器)
通过struts-default.xml/struts.xml 加载拦截器
3.按顺序执行拦截器,放行后执行下一个拦截器,
通过struts.xml - 找到具体action具体方法
返回值找到指定模板(如jsp)
再依次调用拦截器回调函数执行方法
4.通过HttpServletResponse将模板响应到页面
Struts2配置文件加载顺序(重点)
1.default.properties 声明常量 位置:strtus2-core.jar包 - org.apache.struts2包下
2.struts-default.xml 默认初始化配置 位置:struts2-corl.jar
3.struts-plugin.xml Struts插件配置 位置:strtus2的插件包
4.struts.xml 自定义配置文件 位置:创建在自己的工程中
5.web.xml 第二次加载,相关struts2配置加载
错误信息展示设置
1.设置常量 struts.devMode=true //页面显示详细信息
2.设置input视图:拦截器中出现错误会跳转到input
<action>中配置<result name="input">/error.jsp</result>
error.jsp中输出错误:<s:actionerror/><s:fiel
action使用操作 创建Action
1.创建一个pojo类(plani ordinary object,简单java对象)
优点:无耦合 缺点:所有功能需自己完成
2.创建一个类实现com.opensymphony.xwork2.Action接口
默认视图:
ERROR : 错误视图
INPUT: 它是struts2框架中interceptor中发现问题后会访问的一个视图
LOGIN:它是一个登录视图,可以在权限操作中使用
NONE:它代表的是null,什么都不做(也不会做跳转操作)
SUCCESS:这是一个成功视图
优点:耦合度低 缺点:有的功能需自己完成
3.创建一个类继承com.opensymphony.xwork2.ActionSupport类
优点:具有丰富的功能,例如 表单校验 错误信息设置 国际化
缺点:耦合度高
action访问方式
1.将action中对应方法返回值改成String,通过配置<action>的name属性标签匹配
2.简化<action>配置,使用*通配符
如:<action name="xxx*" class="全类名" method="{1}" />
不建议多使用,最多一个通配符
3.动态方法调用(不使用,漏洞)
访问格式:action!方法
须配置常量开启动态方法调用:struts.enable.DynamicMethodInvocation=true
封装数据
1.属性驱动(少用)
a.在action类中提供与请求参数匹配属性,提供get/set方法
b.在action类中创建一个javaBean,对其提供get/set ,在请求时页面上要进行修改,
例如:前台使用ognl表达式:user.username user.password
2.模型驱动ModelDriven(常用)
action实现ModelDriven接口且指定泛型
类中创建私有对象且实例化
实现getModel() 中返回该实例对象
缺点:只能对一个模型数据进行封装
3.使用servlet相关api获取
struts.xml配置 package标签
name 定义包名称,唯一
namespace 配合action中name组合成为一个具体uri
extends 继承配置信息。一般struts-default
abstract 代表当前包时一个抽象的。true该包用于被继承
action 标签
name 配合package中name组合成为一个具体uri
class 该路径所匹配具体的全类名。默认ActionSupport
method 执行类的具体的方法。默认execute
result 指示结果视图
name 和类中方法返回值匹配,进行页面跳转。默认success
type 页面跳转方式。默认dispatch转发,redirect重定向
struts.xml常量配置
(可以在src下创建一个strtus.properties配置文件,可以在web.xml文件中配置)
注意:后加载的配置文件中的常量会覆盖先加载的
<constant name="" value=""></constant>
struts.i18n.encoding=UTF-8 //解决post请求乱码问题
struts.action.extension=action //指定访问strtsu2框架路径的扩展名
struts.devMode=true //提供更加详细报错信息,以及在struts.xml文件修改后不在需要重启服务器,工程上线需关闭
ValueStack/ognl OGNL(Object-Graph Navigation Language)对象图导航语言,功能强大的表达式语言。OGNL本身也是一个项目,可以单独使用
OGNL作用:
支持对象的操作,调用对象的方法
支持静态成员访问
支持赋值操作与表达串联
访问OGNL上下文,访问ActionContext
操作集合对象
ognl主要配合jsp使用
<s:debug/> //页面上显示调试信息按钮
<s:iterator value="集合对象" [var="取出值"]> //遍历集合,如果写了var则取出值会存储到context中,需 #取出值.属性 获取值
ValueStack
作用:将我们action中产生的数据携带到页面上
接口com.opensymphony.xwork2.util.ValueStack
实现类com.opensymphony.xwork2.ognl.OgnlValueStack
包括:
root 本质ArrayList,在根中保存了当前的action对象
context 本质Map(ognl获取数据需要加#),存储一些引用,关于web开发相关信息request、session等
获取ValueStack
1.通过request对象获取
ValueStack valueStack=(ValueStack)ServletActionContext.getRequest()
.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
2.使用ActionContext获取
ActionContext actionContext=ActionContext.getContext();
ValueStack valueStack=actionContext.getValueStack()
ActionContext:action上下文,Struts2会根据每一次的http请求来创建对应的ActionContext,它与当前线程绑
存储数据:action中向root中存储数据,ValueStack的存储结构为栈结构
手动存储:
action存储 valueStack.push(Object)
action存储 valueStack.set("key",Object) //将参数封装到HashMap,存储到root
自动存储:
会将每次访问的action存储到valueStack中
将实现了ModelDriven的模型对象存储到valueStack中
获取数据:jsp中
ognl获取
<s:property value="key" /> //对于set存储的数据
<s:property value="[0].top"/> //对于push存储的数据,根据在栈中数据下标获取(栈中下标从上到下0开始)
<s:property value="属性名" /> //对于对象
EL表达式获取
因为struts2增强了getAttribute()方法,如果在request域中查找不到数据,就会在valueStack中获取
ValueStack存储数据流程:
servlet:单实例,多线程,存在线程安全问题
action:多实例,不存在线程安全问题
一次请求 - 一个线程 - action - -ActionContext - valuestack
流程:浏览器访问一次action意味着发起了一个请求,服务器创建一个request对象
struts创建一个ActionContext,valuestack对象,
valuestack对象保存数据,再把该valuestack对象保存到request域中
Interceptor Interceptor:基于spring aop思想,而aop思想它本质上是通过动态代理来实现
作用:拦截Action的操作,在action的执行前或执行后进行一些其它的功能操作
拦截器链(拦截器栈):就是可以将多个拦截器形成一个链,在访问它们时通过递归调用依次访问
自定义Interceptor
1.创建类
实现 Interceptor(匹配访问当前action的所有方法)
或继承 MethodFilterInterceptor(可以匹配指定方法)
Interceptor接口:
intercept(ActionInvocation invo) //执行操作的方法
return invo.invoke() //放行
2.struts2.xml配置文件中
声明Interceptor
<interceptors> //<package>中
<interceptor name="" class="">
//当实现MethodFilterInterceptor时可配置指定拦截/不拦截的方法
//<param name="includeMethods">方法名,方法名2</param>
//<param name="excludeMethods">方法名,方法名2</param>
</interceptor>
//将多个interceptor封装成一个stack
<interceptors-stack name="myStack">
<interceptors-ref name="" />
<interceptors-ref name="defaultStack" />
</interceptors-stack>
</interceptors>
在<Action>中引入自定义inerceptor
<interceptors-ref name="" /> //name也可为<interceptors-stack>name
注意:当显示引入自定义Interceptor,默认defaultStack需要手动导入
只拦截当前action匹配上的路径
文件上传 浏览器三要素
<form method="post" enctype="multipart/form-data">
<input type="file" name="upload">
服务器端:Commons-fileupoad.jar包
public UploadAction extends ActionSupport{
//添加属性并提供get/set方法
private File upload; //上传的文件,“upload”与文件上传框name属性对应
private String uploadContentType; //上传文件的mime类型
private String uploadFileName; //上传文件名称
请求方法中
//创建服务器端文件:new File(路径,uploadFileName)
//文件上传:FileUtils.copyFile(upload,上面new的)
修改默认上传文件大小
方式一:针对特定<action>,重新配置fileUpload拦截器
<interceptor-ref name="fileUpload">
//配置参数
<param name="key">value</param>
maximumSize 每一个action允许的上传文件大小
allowedTypes 允许文件的mimeType类型,多个逗号分隔,*/*通配符
allowedExtensions=bmp,txt... 设置允许的文件后缀名,多个逗号
</interceptor-ref>
方式二:针对所有action,配置配置
<constant name="struts.multipart.maxSize" value="2097152"></constant>
多个文件上传
只需将三个字段类型改为List或数组
方法中循环遍历操作即可
处理ajax 一种方式:可以获取HttpServletResponse来完成json数据响应。
一种方式:使用struts2框架的json插件完成ajax操作:
1.导入struts2-json-plugin-2.3.24.jar
2.将struts2.xml配置文件中
<package extends="json-default">
<action>中<result type="json">
truts2框架就会将valueStack中的栈顶元素转换成json响应到浏览器
默认响应格式为 ps:json
忽略响应的属性
方式一:在属性get方法上添加注解:@JSON(serialize=false)
方式二:在配置文件<result>下添加参数
//设置不包含的属性
<param name="excludeProperties">ps\[\d+\]\.属性名,...</param>
//设置包含的属性
<param name="includeProperties">ps\[\d+\]\.属性名,...</param>
设置root,设置响应格式为 json
<param name="root">ps</param> //写在参数设置第一行
下面的参数设置不包含属性去掉 ps
注解开发 导入 struts2-convention-plugin-2.3.24.jar(2.1版本后)
注解操作
类上
@Namespace("/") //代替<package namespace="">
@ParentPackage("struts-default") //代替<package extends="">
方法上
@Action(value="",results={@Result(name="",type=""location="")})
value属性<Action name="">
results属性<result name="" type="">location</result>
其他注解
@Actions(@Action(...),@Action(...)) //通过多个映射访问同一个action
@Results //全局结果视图。<golbal-results><result name="" type="">
@InterceptorRef //处理拦截器
在@Action中添加属性:interceptorRefs={@InterceptorRef("name"),...}
注意:@ParentPackage("") 对于自定义拦截器此注解需改为拦截器所在的包名
struts2识别注解:
默认配置<constant name="struts.convention.package.locators" value="action,actions,struts,struts2" />
只要action类的包名中包含value任一值即可识别,否则报错
可以手动改变配置
|
|