struts2
应用环境搭建
1.导入需要的jar文件
只需要导入最简的包,如果同时导入所有包会出现冲突问题和class not found
2.配置WEB应用的配置文件 web.xml
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.
4.
实现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.调用的时候,可以通过
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
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 首设置信息
如果跳转的action在其他的package中,需要以下的配置
good
/imti
ram>
全局的result
当前包下,所有的action都可以使用该result跳转
如果其他的包需要使用全局的result,那么继承定义的包
动态result
在action中通过属性设置path的路径,注意,路径为绝对路径,和在配置文件中的路径完全一样。在action执行的过程中赋值,在配置文件中,使用 ${路径变量名}。
向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
防止重提提交
使用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