当前位置:文档之家› struts2总结学习

struts2总结学习

struts2



应用环境搭建
1.导入需要的jar文件
只需要导入最简的包,如果同时导入所有包会出现冲突问题和class not found

2.配置WEB应用的配置文件 web.xml

struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter



struts2

/*



3.配置struts配置文件
位置: 在classpath下。src/struts.xml


4.web组件




struts默认设置
1.拦截所有请求,只有以.action或者没有后缀名的请求 进入struts框架处理
2.struts2-core.jar中org.apache.struts2包下
属性文件 default.properties
配置了所有的struts默认常量设置。
struts读取常量的顺序

先后顺序
default.properties
struts-default.xml
struts.xml


常见设置
设置请求的后缀名
struts.action.extension

设置字符集编码
struts.i18n.encoding

设置资源文件
struts.custom.i18n.resources



package的namespace 命名空间
https://www.doczj.com/doc/cf13670812.html,space决定action的访问路径,默认为"/",可以接收所有路径的action
https://www.doczj.com/doc/cf13670812.html,space可以写成 "/","/xxx","/xxx/XX"
对应的访问路径
/index.action,/xxx/index.action,/xxx/XX/index.action
https://www.doczj.com/doc/cf13670812.html,space一般在应用中使用模块名来命名





struts简单工作流程



Action
1.具体的业务逻辑和返回视图,由用户自己的Action来处理
2.返回的视图层,根据action返回的字符串在配置文件中 struts.xml中定义
3.必须有name属性,name属性的默认值是"success",而且name属性不能够重复。
4.的默认类型是dispatcher,通过转发的形式跳转



实现Action有3种方法
1.可以是一个普通的java类,只要提供有公开,无参,不抛出异常,返回类型为String的方法,就可以处理业务逻辑。
2.实现com.opensymphony.xwork2.Action接口
3.最常用的是 继承
com.opensymphony.xwork2.ActionSupport
https://www.doczj.com/doc/cf13670812.html,.opensymphony.xwork2.ActionSupport是struts2框架的默认action,执行默认的业务逻辑方法 execute()
5.action中可以有多个符合要求的业务逻辑方法
6.调用的时候,可以通过元素的method属性指定(会产生很多的配置,不推荐使用)
7.使用动态方法调用,通过URL动态指定调用的方法
路径/action名!方法名.后缀名?key=value


action的 通配符 配置
在应用中,配置*表示0个或者多个字符,匹配系统中的应用请求。
使用通配符匹配注意
1.配置的类,方法,页面的命名规则
2.不要出现冲突的配置,同时能匹配多个规则











路径问题

1.页面中的路径
a.相对路径(不带/开头)

对于当前的页面(和当前页面在同一个目录下)

b.绝对路径(带/开头)
/= http://ip:port (http://127.0.0.1:8080/)


2.程序中的路径(配置中的路径)
a.相对路径(不带/开头)
相对于当前的程序(和路径在同一个路径下)
注意,如果是struts的action,相对于action的位置
(配置中全是绝对路径,程序中,又很少写路径)
b.绝对路径(带/开头)(基本上全是绝对路径)
/开头
/就等于 webroot http://ip:port/appname/





使用Action的属性接收请求参数
1.直接使用属性接收
属性名和HTMLform中 input 元素的name属性一致
struts自动根据属性名注入请求的参数


2.使用对象导航方式进行参数的接收
通过 对象.属性的方式 可以直接访问action中对象的属性
当HTML FORM访问了当前对象的时候,由action自动创建对象(对象要提供公开无参的构造方法)

action中的对象,和对象中的属性都必须提供公开的get,set方法


3.action实现ModelDriven接口
实现其中的public Object getModel()方法,HTML页面不需要提供对象。
在访问action的时候通过getModel()方法获取需要注入属性的对象
对象必须有开发人员自己创建,传递给struts框架






简单的数据校验





struts2访问WEB元素
action处理以后,需要访问 request,session,application对象
实现Action必须继承ActionSupport类


1.获取 Http对象(需要使用到除了get.setAttribute方法以外的方法)
a.直接获取
request = ServletActionContext.getRequest();

b.IOC(注入)
实现ServletRequestAware接口
public void setRequest(HttpServletRequest request)

2.获取map类型的WEB元素
常用方式,解耦合,不合WEB应用耦合
开发,测试方便
分层明确
a.直接获取
request = (Map) ctx.get("request");
session = ctx.getSession();
applcation = ctx.getApplication();
b.IOC(注入)



模块包含
可以将一个配置文件xml,当做一个模块包含到struts.xml中
大型项目,分工合作上







Result
result类型
1.dispatcher 转发JSP页面 默认
2.redirect 重定向

3.chain 转发Action
4.redirectAction 重定向Action

5.stream IO流,文件下载

6.freemarker HTML模块
7.velocity
8.xslt
9.plainText

10.httpheader 首设置信息


/r1.jsp
/r2.jsp
r1
r1


如果跳转的action在其他的package中,需要以下的配置

good
/imti

ram>





全局的result
当前包下,所有的action都可以使用该result跳转
如果其他的包需要使用全局的result,那么继承定义的包




动态result
在action中通过属性设置path的路径,注意,路径为绝对路径,和在配置文件中的路径完全一样。在action执行的过程中赋值,在配置文件中,使用 ${路径变量名}。

${path}




向result传递参数
使用redirect跳转方式,向跳转页面传值时使用。



result总结
1.常用的五种 result type
跳转使用4种
....

2.全局的result
包继承

3.动态的result
result传参

在配置文件中,可以使用${name}得到 action中的String 类型的属性



action中的范围


Value Stack
值栈 action



Stack Context
上下文
context





OGNL
Object-graph navigation Language
对象图导航语言

使用struts标签


1.访问值栈中的基本属性
直接访问变量名



2.访问值栈中对象的属性
对象.属性名



3.访问对象中其他对象的属性
类似 2. cat.dog.dname


4.访问值栈中,对象的方法


5.访问值栈中 ACTION 的方法。


如果需要使用静态的方法,需要设置常量
6.访问对象的静态属性
7.访问对象的静态方法
一般只会只有 Math类的静态方法,如果使用Math类,类名可以省略
@@max(5,8)

8.访问普通类的构造方法


9.访问集合List
(一定要提供get,set方法)

10.访问集合的某个元素


11.访问集合的某个元素的属性
|

12.访问集合中元素的某个属性的集合


13. 访问Map


14.访问map中的key对应的对象
|

15.访问map中所有的key


16.访问map中所有的value


17.获取集合的大小


18.投影操作(过滤)
匹配


19.访问指定的action对象




struts标签
/struts-tags

1.通用标签
a.property 用于输出显示的标签
value:ognl表达式,如果不输出表达式,输出字符串,那么:'字符串'
default: 没有值的时候,显示

默认值
escape:是否使用引用。(显示HTML元素还是显示字符)

b.set
id,name:定义变量名,废弃,现在使用var代替
var:定义变量名
scope:范围。(application, session, request, page, or action)
value:变量赋值。类型是 Object

使用var定义,默认范围是 request和action都存放。
如何获取Context中的值:
# 访问Context中的值

c.bean
定义一个对象,可以配合使用param赋值
对象必须是标准的javabean
name: 创建对象的完整类名
var: 变量名
定义出来的对象存放在 Context中,访问的时候需要加 #

d.param
配合bean,给定义的对象属性进行赋值
name:属性名
value: 属性的值,类型是Object

e.debug
开发时,测试使用。了解action中的情况和context的内容。


2.控制标签
a. if
elseif
test: 表达式,值是个boolean类型
如果test为true就执行 标签体内的内容。

else


b. iterator
遍历数组,集合,map等
var:遍历时的变量名
value:被遍历的集合(Object)
begin: 开始,序列从0开始
end:结尾
status:状态。属性可以了解循环的情况
step:循环的步长。 默认为1


c. subset

3.UI标签

Themes
主题
一共有三种主题
simple
xhtml 默认
css_xhtml



Templates
模板


4.$,#,%的使用

$ 配置文件访问action中的内容
# 访问Context中的值
% 把当前的内容(字符串)作为表达式处理
%{ognl表达式}






UI标签
FORM 标签
1.form


action
namespace
和配置文件中的路径一致,自动生成PATH
form的默认提交方式是 POST
默认的主题是xhtml
1.生成表单格式 table css
2.出现fielderror时,会自动根据name属性显示特定错误信息

所有的strutsUI标签都包含有theme属性,可以切换主题


修改原有的主题
1.自定义CSS样式(提倡使用)


2.如果修改内容较多时,可以自定义样式
a.添加样式
在classes下建立template.自定义样式名
b.使用自定义样式
theme="自定义样式名"


struts类型转化

WEB应用
from-server 字符串 转换成 对应类型
server-JSP 对应类型 转换成 字符串


自动类型转换
基本类型,包装类,java,util.Date

显示日期的标签



遇到类型转换异常
struts自动生成一条错误信息,并将错误信息以输入项的name属性为key存放在fieldErrors中
默认提示信息位置:
com.opensymphony.xwork2.xwork-message.properties中
可以通过设置message资源文件来覆盖系统的默认信息
a.创建资源文件
b.在struts.xml中配置


特定的错误信息配置
局部的提

示信息
为XXAction中的属性提供转换异常错误信息
就要在XXAction同包下,建立
XXAction.properties
对于需要提示的错误信息
https://www.doczj.com/doc/cf13670812.html,er.age = ....



集合的类型转换
使用集合的时候,一定要使用泛型

Map
login.action?map[12]=usera&map[13]=userb



自定义类型转换
让struts转换一些自定义类型,可以自己定义类型转换器




1.继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter
重写public Object convertValue(Object value, Class toType)方法

2.注册转换器
a.局部转换器
LoginAction-conversion.properties
属性名 = 转换器完整类名
b.全局转换器
在src下,xwork-conversion.properties
需要转换的完全类名 = 转换器完整类名



输入校验

在action提供
public void validate()方法用于表单验证

当方法中调用addFieldError(fieldName, errorMessage);
当 fieldErrors 中存在内容,那么系统就会自动的跳转到 "input"的 result。


action接收参数的处理流程
1.首先从请求中接收参数
2.对数据进行类型转换
3.类型转换完毕执行输入校验
4.如果类型转换和输入校验都正常(没有fieldErrors),执行execute()
5.如果类型转换不成功,仍然会进行输入校验。


如果action中存在其他的业务逻辑方法
系统仍然会调用 validate()方法用于表单验证

当不同的逻辑需要的表单验证不同时,验证方法可能不能满足全部输入的要求。
其他专用方法的输入校验
public void validateAddUser()

validate方法名() 首字母大写符合javabean的规范


校验的执行顺序

出错 input
类型转换 -->validateAddUser() --> validate() --->
成功 success

1.不重写validate()方法
2.专门验证 validateAddUser()方法
3.如果需要验证execute()方法,书写validateExecute()方法

验证框架
不再作为插件,而是作为struts的内置功能,重用性好,效率更高

在对应的Action同包下,建立
XXAction-validation.xml就可以使用验证框架
1. 字段校验(常用)
2. 校验方法


name:需要验证的表单input的name属性


验证方法位置:com.opensymphony.xwork2.validator.validators.default.xml中配置
子元素
参数
信息


验证框架和 action中的 validate方法同时都会调用

如果action中有多个业务逻辑方法,如何对单独的方法进行验证。
建立
XXAction-action name-validation.xml来对单独的方法进行验证




struts2 核心 拦截器

Interceptor
AOP

拦截器原理


拦截器的实现
设计模式 (动态代理)

目标对象 必须要实现接口
实现主要业务逻辑的对象 Action

切面对象
实现各种辅助功能

的对象 Interceptor

代理对象
最后被执行的对象 包含了目标对象和切面对象的逻辑
ActionProxy



对象.方法(参数)

反射:根据名字来调用
类 class.forname("classname")
方法: method.invoke(对象,参数)



struts中的拦截器执行流程
类似 filter ,调用时先经过的拦截器,在返回时,后经过



自定义拦截器
1.实现Interceptor接口
2.实现Interceptor接口中的方法
public void init()
public void destroy()

3.注册拦截器
4.在action中使用拦截器



拦截器栈
多个拦截器可以组成一个拦截器栈

拦截器栈中所有拦截器的执行顺序
123-action-321

拦截器执行的顺序是按照action中配置的拦截器顺序


为拦截器设置参数



拦截器例子(防止重提提交,防止非法登录)





防止非法登录
使用拦截器
防止非法访问 action

登录login.jsp -->loginAction(session user) --->addUser.action---> addUser

addUser.action--->登录login.jsp

在拦截器中访问session或者其他的WEB对象
Map session = invocation.getInvocationContext().getSession();





防止重提提交

使用struts提供的token拦截器
1.页面加入标签
2.在action中使用token拦截器

出现重复提交的时候,自动跳转到 invalid.token 的result



struts2 国际化
i18n

国际化原理
JDK 提供的 自动国际化转换

Locale[] locales = Locale.getAvailableLocales();

for(Locale l:locales){
System.out.println(l.getDisplayLanguage()+" : "+l.getDisplayCountry());
}

Locale 本地语言信息
语言
国家


i18n资源文件命名规则
basename_language_country.properties


struts应用的国际化

1.JSP页面上的国际化
2.Action中信息
3.资源文件的范围
类型转换信息
验证框架信息

4.提示信息等国际化


一般有提示信息的文件,才需要国际化,国际化采取的都是资源文件的命名来区分不同的语言和地区。

通过请求参数切换语言类型
i18n.action?request_locale=zh_CN





文件上传,下载

文件上传
form设置:
1. method = POST
2. enctype="multipart/form-data" 二进制数据,用于数据处理

enctype上传数据的格式
默认格式是 key=value



struts框架提供的文件上传

1.尽量使用struts form标签生成form

2.在文件上传的action中定义 类型为java.io.File类接收参数
String contentTypeName = inputName + "ContentType";
String fileNameName = inputName + "FileName";

3.设置文件上传的参数
临时文件的路径
文件最大的size




struts框架提供的文件下载
1.http协议返回 2进制的流
2.直接写一个连接指向 目标文件

如果下载的内容需要其他操作(扣积分,付费)或者是下载需要身份权限等

1.将资源文件存放在不公开的部分
2

.页面通过struts的请求,访问下载资源 xx.action
3.书写action类
提供一个返回下载资源的 InputStream的方法。供用户获取下载的资源
方法命名,符合javabean规范
4.配置


feiqiuFile

可以在tomcat的 conf文件夹下得web.xml中查询
application/octet-stream























相关主题
文本预览
相关文档 最新文档