*1、如何获取Session
1)ActionContext获取,返回Map类型
Map<String,Object> session = ActionContext.getContext().getSession();
2)ServletActionContext获取,返回HttpSession类型
HttpSession session = ServletActionContext.getRequest().getSession();
3)让Action实现接口SessionAware,之后Struts2在实例化Action之后会自动判断这个Action是否为SessionAware,如果是就会调用实现的方法,将session注入进来给Action。
public class XXAction implements SessionAware {
private Map<String,Object> session;
public void setSession(
Map<String,Object> session) {
this.session = session;
}
}
4)这三种方式都可以访问Session,并且他们的数据是一份即共享的。但是如果要使用的话,只选择一种方式即可,不要混合用。推荐使用接口注入的方式,即第三种。
5)登录成功后,将登录信息记录到Session
2、Struts2对EL表达式的支持
1)EL表达式需要从4个范围取值,page,request, session,application。(从前往后是取值顺序)
2)Struts2做了一些处理来兼容EL表达式的取值,即不使用原始的request,而是提供一个request 的包装类,在此类中覆写request的get方法,这样EL表达式在向request取值时,struts2会实际上让它向ValueStack取值
3、通配符
1)什么是通配符:
用来简化struts.xml配置的
2)原理:
约定大于配置,即我们写的Action类名、JSP文件名满足一定的规则,那么基于这样的规则,我们可以使用通配符来描述。
3)写一个项目,模拟增加、修改、查询功能。并且让每个Action类、每个页面都具有命名规则:采用“动作+模块”命名。
4)基于上面的规则,我们使用通配符来做struts.xml的配置,并且比较不采用通配符和采用通配符他们的优劣。
通配符优点:
--大大简化配置文件struts.xml的代码
通配符缺点:
--创建类名、JSP文件名时,必须满足严格的规则
--我们通过配置文件,无法直观的看出Action和JSP页面的关系,不直观。
*4、Result原理
1)Result组件是Struts2中6大核心组件之一,主要是用于做输出的。
2)Struts2内置了10种类型的Result,这些Result定义在struts-default.xml中,他们都是Java类,都实现了统一的接口Result。
3)讲以下几种
使用:用type属性指定result类型 <result name="success" type="stream"></result>
a、dispatcher
--用于将请求转发给页面的,是默认使用的Result。
b、redirectAction
--用于将请求重定向给Action的
--用法
<result name="ok" type="redirectAction">
actionName
</result>
c、stream
--以二进制的形式向页面输出数据
d、json
--不是struts2内置的Result
--这种类型的Result特别常用,用于向页面输出json格式的字符串。
--常用于异步校验
5、stream类型的Result
1)以二进制形式向页面发送数据(如:使用stream类型的result向页面输出验证码图片)
2)写法
<result name="ok" type="stream">
<param name="inputName">
Action中的属性名
</param>
</result>
--param的name值,必须是inputName
--Action中的属性名,对应的属性类型应该是 InputStream类型。
*6、json类型的Result
1)这种类型的Result不是Struts2默认提供的,需要单独引用包。2)使用步骤
a、导包
b、将struts.xml中的package继承于json-default
c、引用json类型Result
--*使用root方式,指定将Action中某一个属性的值以json字符串传递给页面
<result name="ok" type="json">
<param name="root">Action某属性</param>
</result>
说明:
--如果指定的属性是基本类型,直接返回值,比如boolean isMarry = true; json类型的Result将返回true。
--如果指定的属性是JavaBean,json类型的Result会把这个对象转变成一个json输出,如{"name":"zhangsan","pwd":"123"}
--使用includeProperties,指定将Action中某几个属性的值以json字符串传递给页面,注意这里多个属性之间以,隔开,并且多个属性都是基本类型的。
<result name="ok" type="json">
<param name="includeProperties">
Action属性1,Action属性2,...
</param>
</result>
说明:
--返回的格式如{"a":"A","b":"B"}
--不写param,此时json类型的Result会把整个Action做成一个json格式的字符串,发送给页面。
说明:
--返回格式如{"name":"zs","pws":"123"}
7、Struts2的UI标签
1)用途--用来生成文本框、密码框、单选框、复选框、下拉选等框体
--*生成框体之后,可以自动根据请求的Action中的属性值,给框体赋值,这种自动赋值的行为称之为数据的回显。
--*根据很简单的标签语言,自动生成单选框、复选框、下拉选等选择性框体,并根据请求的Action的属性值,自动的选择数据。
2)UI标签
a、简单标签
--form
用于生成<form>元素
--submit
用于生成submit按钮
--文本框
用于生成<input type="text"/>
--密码框
用于生成<input type="password"/>
--文本域
用于生成<textarea>
--单值复选框
用于生成一个<input type="checkbox"/>
b、复杂标签
--单选框
用于生成一组单选框radio
--复选框
用于生成一组复选框checkbox
--下拉选
用于生成一个select,其中包含多个option
8、拦截器
1)什么是拦截器?--拦截器是Struts2中六大核心组件之一,是用于扩展Action的组件。
--主要用于处理Action共通的事务,比如记录日志、权限检查、处理事务等等。
2)拦截器使用步骤
a、创建拦截器组件(类),实现接口Interceptor
b、在struts.xml中注册拦截器,注册标记为<interceptor>
c、在Action的配置中,引用注册好的拦截器,引用标记为<interceptor-ref>
3)拦截器栈
--是对拦截器的一个打包,它可以直接被Action引用,当Action引用拦截器栈时,相当于引用了该栈下的所有拦截器。
--通过标签<interceptor-stack>定义拦截器栈
--Struts2中默认定义了很多个拦截器栈,其中
a、basicStack是基础拦截器栈,我们对拦截器引用时,不能丢掉该栈的内容,就是说如果不引用这个栈,Struts2很多功能运行不了。
b、defaultStack是默认拦截器栈,其内容包含了basicStack的内容,并且比它多,是常用拦截器的一个打包。Struts2通过标签<default-interceptor-ref>来指定默认拦截器栈,我们可以在struts.xml中来改变其默认的引用,但是改变默认引用时千万别忘了要至少包含basicStack。
--当Action中手动引用一个自定义拦截器时,那么该Action会丢掉对默认拦截器的引用。此时,需要再手动的将默认拦截器加进来。
9、拦截器实例:登录检查
1)使用拦截器做登录检查,即如果用户没有进行登录,而是直接在浏览器地址栏中输入URL访问Action,需要做检查,未登录则不允许直接访问。2)如果模块所有的Action都是这样的逻辑,所以为了避免在每个Action中写重复的代码,我们可以使用拦截器来做这件事。即写一个登录检查拦截器,并且让该模块下所有的Action引用,当访问Action时,代码被拦截器截获,拦截器中判断是否已经登录, 若没有登录则踢回到登录页面,否则允许其访问该Action。
3)登录模块的Action需要引用这个拦截器吗?
由于登录功能就是完成用户的登录,因此不需要引用登录检查拦截器来做检查。
10、使用拦截器做文件上传
1)Struts2自带文件上传的拦截器,能够帮助我们处理文件上传的功能,拦截器是fileUpload,我们可以直接使用。2)原理:
a、当点击提交按钮,提交文件上传表单时,该请求会被fileUpload拦截器截获,此拦截器会将表单中的文件暂时上传到tomcat中某临时路径下。
b、然后拦截器将此文件的引用传递给请求的Action, Action中需要将此临时文件转移到某固定的位置。
c、拦截器需要清除掉临时路径下的临时文件。
3)注意
需要引入新的包common-io.jar