struts2详细总结
Posted zdfldrz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2详细总结相关的知识,希望对你有一定的参考价值。
struts2的执行过程:
第一部分
11_Struts2分模块开发
对于struts2的开发模式基本都是模块式的进行,这点将在后续总结中逐步渗透!
12_Action三种编写方式
在struts2中,action的编写共有三种方式,其中为:
- 第一种:创建普通类,这个类不继承任何类,不实现任何接口
- 第二种:创建类,实现按action接口
- 第三种:创建类,继承类ActionSupport (这是最常用的方式)
13_Action的方法访问介绍
1、有三种方式实现Action的访问
-第一种:使用Action标签的methods属性,在这个属性里面写执行的Action方法,这种方式访问时,会发现同一个Action被重复写了好多次
-第二种:使用通配符的方式
--在Action标签里面的name属性,name属性值里面写符号* 星号
--* 理解:表示匹配任意类型
--比如访问hello_add,则hello_*可以匹配到
--用这种方式时,注意页面Action的name要和Action标签里面的name属性值相同,即都是hello_*,且在Action中的method方法取值为method=“{1}”,其中“1”表示一个星号。
-第三种:动态访问实现(不常用)
2、错误查看:
-如果Action方法有返回值,在配置文件中没有配置,出现错误:
404-No result defined for action HelloAction and result 返回值名字
3、Action里面的方法有返回值,如果有返回值时,其类型必须是String
4、Action里面的方法可以没有返回值,没有返回值时候,在result标签不需要配置
-只需把方法写成void
-让返回值,返回“NONE”;
如:public String execute(){
return:NONE;
}
14、案例-基本步骤
-搭建struts2环境:
--导包
--写Action方法,继承ActionSupport()
--配置struts.xml
--web.xml中配置struts2相关的过滤器
第二部分
1、 结果页面配置
--全局结果页面
--result标签配置action方法的返回值到不同的页面中
--创建两个action,都执行默认的方法execute(),让两个action的方法都返回success,返回success之后,配置到同一个页面
--在同一个Action类中,如果多个方法的返回值相同,返回到的页面也相同,这时可以使用全局页面配置,此时:在packege标签里应写上:
<global-results>
<result name=”success”>/hello.jsp</result>
</global-results>
此时在原来对应的action里面的相同的result标签配置可以删除,注意全局结果配置作用域为一个packege
--局部结果页面
--如果既配置了全局页面,又配置了局部页面,则最终生效的是局部页面配置
--type属性值
--默认值:做转发操作,值为:dispatcher
--另一个值:做重定向先操作:值为:redirect
--上面的两个值dispatcher和redirect一般针对到页面中的配置,配置到其他的action里面
--chain:转发到action,一般不用,缓存问题
--redirectAction:重定向到action
2、在action中获取表单提交的数据
之前web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParameter,getParameterMap,而在struts2中,提交表单到Action,但是action中没有request对象,不能直接使用request对象获取数据,所以得获取request对象,主要有三种方式:
--使用ActionContext类获取
Map<String ,Object>getParemeters():返回一个包含所有HttpServletRequest参数信息
--因为方法不是静态方法,需要创建ActionContext类的对象
--这个ActionContext类对象不是new出来的
--static ActionContext getContext():获取当前现成的ActionContext对象
在Action中使用ActionContext获取数据: //1 获取ActionContext对象 ActionContext context = ActionContext.getContext(); //2 调用方法得到表单数据 //key是表单输入项name属性值,value是输入值 Map<String, Object> map = context.getParemeters(); Set<String> keys = map.keySet(); For(String key : keys){ //根据key得到value //数组形式:因为输入项里面可能有复选框情况 Object[] obj = (Object[]) map.get(key); System.out.println(Arrays.toString(obj)); } |
--使用ServletActionContext类获取
--static HttpServletRequest getRequest():获取web应用的HttpServletRequest对象
--static HttpServletResponse getResponse():获取web应用的HttpServletResponse对象
--static ServletContext getServletContext():获取web应用的对ServletContext 对象
--static PageContext getPageContext():获取web应用的对PageContext 对象
--调用类里面的静态方法,得到request对象。
Demo2:使用ServletActionContext类获取 //1 使用ServletActionContext获取request对象 HttpServletRequest request = ServletActionContext.getRequest(); //2 调用request里面的方法得到结果 String username= request.getParameter(“username”); System.out.println(username); |
--使用接口注入方式(不经常用)
--让action实现接口,为了得到request对象
Demo3:使用接口注入方式 Public class Form3DemoAction extends ActionSupport implements ServletRequestAware{ Private HttpServletRequest request; @Override Public void setServletRequest(HttpServletRequest request){ this.request = request; }
Public String Execut() throws Exception{ Request.getParameter(“username”);
Retun NONE; } } |
3、07-action操作域对象
--request、session、ServletContext域对象
--使用ServletActionContext类操作
--操作三个域对象
//1 request域:
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute(“req”,”reqValue”);
//2 session域
HttpSession session = request.getSession();
session.setAttribute(“sess”,”sessValue”)
//3 ServletContext域
ServletContex context = ServletActionContext.getServletContext();
context.setAtribute(“contextname”,”contextValue”);
4、Struts2封装获取表单数据方式
--原始方式获取表单数据封装到实体类对象
--获取表单数据
--new一个实体类对象,并通过set方法将数据封装到实体类
--属性封装
--在action中成员变量的位置定义表对应name属性名字相同的变量
--生成该变量的set和get方法
--此时可直接得到表单数据,但是也不能直接将数据封装到实体类的对象中
--模型驱动封装
--使用模型驱动方式,可以直接把表单数据封装到实体类对象中
--实现步骤:
1>action实现接口ModelDriven
2>实现接口里面的方法getModel方法
--把创建的对象返回
3>在action里面创建实体类对象
Public class DataDemo2Action extends ActionSupport implements ModelDriven<User>{ //前提要求:表单name属性名字和实体类属性名字要一样 Private User user = new User(); @Override Public User getModel(){ Return user; } } |
--使用模型驱动和属性封装时注意的问题
--在一个action中,获取表单数据可以使用属性封装,也可以使用模型驱动封装,但是不能同时使用属性封装和模型驱动封装获取同一个表单数据,如果同时使用,只会使用模型封装,而属性封装会不发挥作用。
--表达式封装(会用就可以)
--也可以把表单数据封装到实体类对象中
--第一步:在action中申明实体类
--第二步:生成实体类变量的set和get方法
--第三步:在表单输入项的name属性值里面写表达式形式
Public class EataDemo3Action extends ActionSupport{ //1申明实体类 Private User user; //2 生成实体类变量里面的set和get方法,即user的get和set方法
@Override Public String execute() throws exception{ System.out.println(user); Return NONE; } }
页面 <body> <form action=”${pageContext.request.contextPath}/data3.action”method=”post”> Username:<input type=”text” name=”user.username”/> <br/> Password:<input type=”text” name=”user.password” /> Address:<input type=”text” name=”user.address” /> <input type=”submit” value=”提交”/> </form> </body> |
--表达式封装也可以归类到属性封装中
--表达式封装与模型驱动封装的比较
--使用表达式封装和模型驱动封装都可以把数据封装到实体类对象中
--不同点:
--使用模型驱动只能把数据封装到一个实体类对象中
--在一个action里面不能使用模型驱动把数据封装到不同实体类对象里面
--使用表达式封装可以把数据封装到不同实体类对象里面
--封装数据到list集合
--封装书到List集合
--第一步:在action里面声明List
--第二步:生成list变量的get和set方法
--第三步:在页面中写表达式
Public class ListAction extends actionSupport{ //1声明list Private List<User>list; //2 生成list的get和set方法 }
页面 <body> <form action=”${pageContext.request.contextPath}/list.action”method=”post”> <!—List[0]:表示list集合中的第一个user对象--> Username:<input type=”text” name=”list[0].username”/> <br/> Password:<input type=”text” name=”list[0].password” /> <br/> Address:<input type=”text” name=”list[0].address” /> <br/><br/>
Username:<input type=”text” name=” list[1].username”/> <br/> Password:<input type=”text” name=” list[1].password” /> <br/> Address:<input type=”text” name=” list[1].address” /> <br/> <input type=”submit” value=”提交”/> </form> </body> |
--封装数据到Map集合
--声明map集合
--生成get和set方法
--在表单输入项的name属性值里面写表达式
Public class MapAction extends actionSupport{ //1声明map集合 Private Map<String,User> map; //2 生成list的get和set方法 }
页面 <body> <form action=”${pageContext.request.contextPath}/map.action”method=”post”> <!—设置key值map[’key值’],key值可以随便设置;设置value值--> Username:<input type=”text” name=”map[‘one’].username”/> <br/> Password:<input type=”text” name=” map[‘one’].password” /> <br/> Address:<input type=”text” name=” map[‘one’].address” /> <br/><br/>
Username:<input type=”text” name=” map[‘abcd’].username”/> <br/> Password:<input type=”text” name=” map[‘abcd’].password” /> <br/> Address:<input type=”text” name=” map[‘abcd’].address” /> <br/> <input type=”submit” value=”提交”/> </form> </body> |
--封装数据总结
第三部分
1、ognl概述
1.1之前web阶段,学习过EL表达式,el表倒是在jsp中获取域对象里面的值
1.2是一种功能更强大的表达式
1.2.1在struts2里面操作値栈数据
1.2.2一般把ognl在struts2操作,和struts2标签一起使用操作値栈数据
1.3ognl不是struts2的一部分,没struts2的项目也可以使用,只是经常和struts2一起使用
--使用ognl时候首先导入jar包,strts2提供jar包
2、ognl入门案例
2.1 使用ognl+struts2标签实现计算字符串长度
2.1.1支持对象方法调用。例如:objName methodName();
2.1.1在java代码中,调用字符串length()函数;
2.2使用到struts2的标签
2.2.1使用jstl时候,除了导入jar包外,在jsp页面需要引入标签库,使用struts2标签也一样,需要引入标签库。
<%@ taglib uri=”/struts-tags”prefix=”s”%>
2.3使用struts2标签实现操作
Ognl . jsp页面 <body> <!—使用ognl+struts2标签实现计算字符串长度--> <s: property value=”’haha’.length()”/> </body> |
3、值栈
3.1之前web阶段,在servlet里面进行操作,把数据放到域对象里面,在页面中使用el表达式获取到,域对象在一定范围内存值和取值
3.2在struts2中本身提供一种存储机制,类似于域对象,是値栈,可以存值和取值
3.3 在action里面把数据放到値栈里面,在页面中获取到値栈数据
3.4 servlet和action的区别
servlet:servlet对象默认在第一次访问的时候创建,只创建一次,单实例对象
action:访问时候创建,每次访问action时候,都会创建action对象,创建多次,多实例对象
3.5値栈存储位置
(1)每次访问action时候,都会创建action对象
(2)在每个action对象里面都会有一个值栈对象(且只有一个)
値栈存储位置
4、获取值栈对象
4.1 获取值栈对象有多种方式
(1)常用方式,使用ActionContext类里面的方法得到值栈对象
Public class UserAction extends actionSupport{ //1 获取ActionContext类的对象 ActionContext context = ActionContext.getContext(); //2 调用方法得到值栈对象 ValueStack stack1 = context.getValueStack(); } |
5、值栈的内部结构
5.1 值栈分为两部分
5.1.1第一部分:root,结构是list集合
(1)一般操作都是root里面的数据
5.1.2第二部分:context,结构map集合
5.1.3 struts2里面的标签 s:debug ,使用这个标签可以查看值栈结构和存储值
(1)访问Action,执行action的方法,有返回值,配置返回值到jsp页面中,在jsp
页面中使用这个标签
Public class valueStackDemoAction extends actionSupport{ Public String execute() throws Exception{ Return “success”; } }
Jsp页面 引入标签: <%@page language=”java” contentType=”text/html;charset=UTF-8” pageEncoding=”UTP-8”%> <%@ tagelib uri=”/struts-tags” prefix=”s”%> <body> <s:debug></s:debug> </body> |
(2)在action没有做任何操作,栈顶元素是action的引用
6、值栈的内部结构
6.1 向值栈中放数据的多种方式
6.1.1 第一种:获取值栈对象,调用值栈对象里面的set方法
6.1.2 第二种:获取值栈对象,调用值栈对象里面的push方法
6.1.3 第三种:在action定义变量,生成变量的get方法(常用)
//第一种方式:使用值栈对象里面的set方法 Public class valueStackDemoAction extends actionSupport{ Public String execute() throws Exception{ //1 获取值栈对象 ActionContext cotext = ActionContext.getContext(); ValueStack stack = context.getValueStack(); //2 调用set方法 Stack.set(“username”,”username1”); Return “success”; } }
//第二种方式:使用值栈对象里面的push方法 Public class valueStackDemoAction extends actionSupport{ Public String execute() throws Exception{ //1 获取值栈对象 ActionContext cotext = ActionContext.getContext(); ValueStack stack = context.getValueStack(); //2 调用push方法 Stack.push(“abcd”); Return “success”; } }
//第三种方式:在action定义变量,生成变量的get方法 Public class valueStackDemoAction extends actionSupport{ //1 定义变量 Private String name; //2 生成get方法 Public String execute() throws Exception{ name = “abcd”; Return “success”; } }
|
以上是关于struts2详细总结的主要内容,如果未能解决你的问题,请参考以下文章