struts2
struts2框架的概念
充当了MVC中Controller(控制器),可替换原有的Servlet(Action)
struts2程序
开发环境搭建
①获得Struts2开源框架(OpenSource)附带源代码。下载地址:www.apache.org
Version:2.x
②项目中引入Jar包: javassist 分析、编辑和创建字节码类库
1). Struts2的核心Jar包(struts2-core-2.3.15.1)。
2). 第三方依赖Jar包(Strtus2框架的设计者在实现过程当中,所使用的其他厂商提供的工具或Jar包)
③导入Struts2的配置文件:struts.xml
路径位置:
–struts2-blank.war
扫描二维码关注公众号,回复: 3051555 查看本文章WEB-INF
classes
struts.xml
注意:将struts.xml放置在项目的src中
④导入web.xml,或在原生web.xml中配置struts2的核心过滤器,让struts2框架生效。
⑤完成struts2的(Controller层)编码
I、实现Action接口、覆盖execute()方法
public class MyFirstAction implements Action{
@Override
public String execute() throws Exception {
System.out.println("---this is my first action------");
return "success";
}
}
II、配置struts.xml
<package name="basic" extends="struts-default">
<!-- action中name代表访问路径(别名),class代表真实的访问类 -->
<action name="firstAction" class="controller.MyFirstAction">
<!-- action标签包含result标签,其中的name属性表示控制器中execute()方法返回值标记(目标文件的路径名称) -->
<result name="success">/index.jsp</result>
</action>
</package>
III、通过Action中的返回值和 < result > 完成页面跳转
IV、通过Struts2的工具类ServletActionContext获得作用域对象、并收集数据
Action对象的创建
a、多次请求同一个Servlet只创建一个Servlet对象
b、多次请求同一个Action对象会创建多个Action对象(每次请求都会创建一个)
struts2的跳转
1、Action跳转到jsp页面
I、dispatcher(默认的跳转方式):URL不变
II、redircet(重定向):URL改变
2、Action到Action之间的跳转
I、chain(Action中的转发):URL不变
result的值为将要跳转的action的name值,可以转发,result中必须手写type=”chain”
II、redirectAction(Action中的重定向):URL改变
result的值为将要跳转的action的name值,可以重定向,result中必须手写type=”redirectAction”
package包标签
作用
I、按功能划分模块,管理不同 标签
II、功能的复用。(拦截器)
package添加namespace后访问路径必须添加namespace,否则出现404
Action 间的跨包跳转
跨包跳转方式:chain | redirectAction
全局跳转 global-results 标签
I、标签位置: 标签属于的子标签,定义在所有之前。
<global-results>
<result name="success">/success.jsp</result>
</global-results>
在整个中,如果存在没有的标签,则使用全局跳转
II、注意:
①如果配置了局部则优先执行
②全局跳转只在本包有效
③全局跳转必须定义在所有Action之前
④全局变量一定是在后期开发中,重构项目时使用的
struts2处理字符集乱码
一、Struts2处理字符集乱码:
1、请求乱码:
I. get请求:超链、地址栏、表单(method=”get” | 默认)
解决方案:(tomcat/conf/server.xml –> URIEncoding=UTF-8)。
II. post请求:表单(method=”post”)
解决方案:request.setCharacterEncoding(“UTF-8”); | Filter中解决
2、 响应乱码:
I. 代码:response..setContentType(“text/html ;charset=UTF-8”); | Filter中解决
II. JSP:
<%@ pagepageEncoding="UTF-8" contentType="text/htm;charset=UTF-8"%>
3、总结:Struts2自动对post请求执行UTF-8字符编码处理。
struts2获取Client数据【重点】
1、Action实例变量接收零散数据
优势:使用方便、自动转换成匹配的数据类型。
注意:对于日期类型而言,顺序必须是(年、月、日),常用格式(yyyy-MM-dd)
XXXAction中同时需要提供响应实例变量的get和set方法
2、Action实例变量接收对象数据
注意:JSP页面中表单元素的name值应该为:实例变量(Entity).实体属性名。例如:user.username
XXXAction中同时需要提供响应实例变量的get和set方法
3、Action实例变量接收List、Set、数组数据:hobbys tags
4、Action实例变量接收Map数据:citys
DMI(Dynamic Method Invocation):动态方法调用
配置标签中的method方法
继承ActionSupport完成Action类
DMI 高级配置(使用通配符)
通配符跨包跳转
OGNL(Object-Graph Navigation Language):对象导航语言
I、语法与EL相似、功能强大、简单的表达式语言
II、可直接访问对象的getters方法、还可直接访问对象的普通方法
III、OGNL是一套独立的、完整的技术组件、不属于Struts本身
总结:
I、List:直接书写属性名称,即可完成List中的逐个对象查找,以及目标属性的获取。
II、 Map:#为前缀+key查找Map中的目标对象,再导航查找各个属性。
ValueStack(值栈)
概念
Struts2中提供的逻辑上的存储空间,统筹管理了一次请求中所涉及到的所有
数据。
值栈的特点、好处:
与视图层解耦(JSP基于内置对象获取作用域数据,运行效率低),不同的视图层获取数据的方式不同,没有统一的访问形式。
ValueStack提供两个存储空间,Root区是常用的栈结构;Context区是操作作用域的键值结构。可OGNL对ValueStack进行便利的访问。
每次请求某个Action时,会产生独立的ValueStack对象。
值栈的操作
Root区
栈(Last In First Out),访问时,直接获取栈顶元素。Root下标代表栈的起始,获得到的是起始下标的子集
Context 区
Struts2在ValueStack中提供Map格式存储空间,主要用来操作JavaEE作用域
值栈操作常用的书写方式
ValueStack使用经验:
1、操作Root:vs.push()、Action中声明实例变量。
2、操作Context:vs.setValue(“expr”, Object);
将对象存入已有的作用域中(request、session、application)
Struts2标签:OGNL表达式 +Struts2标签(页面数据展示、逻辑处理)
- 作用:逻辑处理,用以替代EL表达式。
2. 使用方式:
I. 引入标签库:
<%@taglib uri="/struts-tags" prefix="s" %>
II. 选择标签:
1). 单条数据展示:
2). 条件判断:
3). 遍历:
struts2高级标签
获取日期类型、并格式化
URL重写
1). JSP到JSP:
2). JSP到Action:
将带有数据的动态页面汇总在同一个页面中
实战:商城首页内容显示
struts2开发结构
Struts2拦截器(Interceptor)
拦截请求及响应。可将多个Action中共有的代码提取到拦截器,从而减少Action中
的代码冗余。(和Filter作用相同,如:权限验证)
实现
实现Interceptor接口
配置文件书写
拦截响应:
ai.invoke()方法之前执行的代码片段,称为拦截请求;
ai.invoke()方法之后执行的代码片段,称为拦截响应。
中断请求
拦截器栈
引用默认的拦截器栈
<defult-interceptor-ref name="MyStack" />
Struts2.xml中标签的书写顺序
I. 拦截器
II. 拦截器栈
III. 默认引用的拦截器(栈)
IV. 全局跳转
V. Action
Struts2的拦截体系:
I. 系统拦截器:struts2-core-2.3.15.1.jar的根中struts-defalt.xml
II. 继承,引用此包中的默认拦截器栈
III. 注意:如果添加自定义拦截器,同时需要使用默认拦截器栈,则需要在配置文件中依次引用。
Cookie拦截器
I、Cookie的存储
II、获取Cookie
实现接口CookieAware
III、获取Cookie的Action配置: