JAVAWEB开发之Struts2详解(二)_第1页
JAVAWEB开发之Struts2详解(二)_第2页
JAVAWEB开发之Struts2详解(二)_第3页
JAVAWEB开发之Struts2详解(二)_第4页
JAVAWEB开发之Struts2详解(二)_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JAVAWEB开发之Struts2详解(二)Action接受请求参数、类型转换器、使用Struts2的输入校验、以及遵守约定规则实现Struts2的零配置Action接受请求参数作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中Struts2提供了非常强大的类型转换机制用于请求数据 到 model对象的封装Struts2和MVC定义关系StrutsPrepareAndExecuteFilter:控制器在Struts2中action是什么?(Struts2是一个MVC框架)V:jspM:actionC:action StrutsPrepareAndExecuteFilt

2、erStruts2提供了三种数据封装方式:Action本身作为model对象,通过成员setter封装。(属于属性驱动)创建独立model对象,页面通过ognl表达式封装。(属于属性驱动)使用ModelDrivern接口,对请求数据进行封装。(属于模型驱动)具体使用如下:1.属性驱动 属性驱动方式(一):直接将action作为一个model,就可以得到请求参数action类成员变量setter接收参数如下图所示:问题1:action封装请求参数,会不会存在线程安全问题? 是不会的,因为每一次请求,都是一个新的action优点:使用简单缺点:需要单独定义JavaBean,将action中属性co

3、py到JavaBean中(不能将Action作为model传给service层)这种方式,底层是通过反射进行实现的。属性驱动方式(二):创建一个单独的Model类,在action类中引用model作为成员变量。(页面使用ognl)具体操作:在action类中声明一个mdoel,private User user; 提供对应的setter和getter方法。在页面上使用ognl来进行描述 如下图所示:这种方式的优点:简单易使用,解决了第一种封装的问题。缺点:在页面上使用了ognl表达式,页面不通用了。问题:这种方式,数据是怎样封装的?是通过Struts2中name为params的intercep

4、tor拦截器进行的数据封装(Struts的核心core包下struts-default.xml中定义)2.模型驱动(在开发中应用比较多)模型驱动的步骤:1.让action 类实现ModelDrivern接口。2.重写getModel方法3.在action中实例化一个model对象,让getModel方法返回这个对象。 public class Login3Action extends ActionSupport implements ModelDriven private User user = new User();public User getModel() return user; 如下

5、图所示:页面:username1:password1:username2:password2:action类:private Map map;提供get/set示例:1.将action作为model(属性驱动方式一)Login1Actionjava view plain copy 在CODE上查看代码片派生到我的代码片package cn.itcast.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymph

6、ony.xwork2.ActionSupport; / 获取请求参数 属性驱动 第一种,直接将action作为model public class Login1Action extends ActionSupport private String username; private String password; public String getUsername() return username; public void setUsername(String username) this.username = username; public String getPassword() r

7、eturn password; public void setPassword(String password) this.password = password; Override public String execute() throws Exception HttpServletRequest request = ServletActionContext.getRequest(); / 2.判断用户名与密码是否正确 if (tom.equals(username) & 123.equals(password) request.getSession().setAttribute(user

8、name, username); return SUCCESS; else request.setAttribute(login.message, 用户名或密码错误); return failer; login1.jsphtml view plain copy 在CODE上查看代码片派生到我的代码片 Insert title here $requestScopelogin.message username: password: 2.将model对象作为Action类成员(属性驱动模式二)封装Model类Userjava view plain copy 在CODE上查看代码片派生到我的代码片pa

9、ckage cn.itcast.domain; public class User private String username; private String password; public String getUsername() return username; public void setUsername(String username) this.username = username; public String getPassword() return password; public void setPassword(String password) this.passw

10、ord = password; Override public String toString() return User username= + username + , password= + password + ; Login2Actionjava view plain copy 在CODE上查看代码片派生到我的代码片package cn.itcast.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import cn.itcast

11、.domain.User; import com.opensymphony.xwork2.ActionSupport; / 获取请求参数 属性驱动 第二种,直接在action上声明一个model public class Login2Action extends ActionSupport private User user; public User getUser() return user; public void setUser(User user) this.user = user; Override public String execute() throws Exception H

12、ttpServletRequest request = ServletActionContext.getRequest(); / 2.判断用户名与密码是否正确 if (tom.equals(user.getUsername() & 123.equals(user.getPassword() request.getSession().setAttribute(username, user.getUsername(); return SUCCESS; else request.setAttribute(login.message, 用户名或密码错误); return failer; login2.

13、jsphtml view plain copy 在CODE上查看代码片派生到我的代码片 Insert title here $requestScopelogin.message username: password: 3.模型驱动(action类实现ModelDrivern接口)Login3Actionjava view plain copy 在CODE上查看代码片派生到我的代码片package cn.itcast.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletAct

14、ionContext; import cn.itcast.domain.User; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; / 获取请求参数 模型驱动 public class Login3Action extends ActionSupport implements ModelDriven private User user=new User(); Override public User getModel() return user; Override

15、 public String execute() throws Exception HttpServletRequest request = ServletActionContext.getRequest(); / 2.判断用户名与密码是否正确 if (tom.equals(user.getUsername() & 123.equals(user.getPassword() request.getSession().setAttribute(username, user.getUsername(); return SUCCESS; else request.setAttribute(login

16、.message, 用户名或密码错误); return failer; login3.jsphtml view plain copy 在CODE上查看代码片派生到我的代码片 Insert title here $requestScopelogin.message username: password: success.jsphtml view plain copy 在CODE上查看代码片派生到我的代码片 Insert title here $username 4.将数据封装到List集合list.jsphtml view plain copy 在CODE上查看代码片派生到我的代码片 Inser

17、t title here username: password: username: password: ListActionhtml view plain copy 在CODE上查看代码片派生到我的代码片package cn.itcast.action; import java.util.List; import cn.itcast.domain.User; import com.opensymphony.xwork2.ActionSupport; public class ListAction extends ActionSupport private List users; public

18、 List getUsers() return users; public void setUsers(List users) this.users = users; Override public String execute() throws Exception System.out.println(users); return null; 5.将数据封装到Map集合map.jsphtml view plain copy 在CODE上查看代码片派生到我的代码片 Insert title here username: password: username: password: MapActi

19、onjava view plain copy 在CODE上查看代码片派生到我的代码片package cn.itcast.action; import java.util.Map; import cn.itcast.domain.User; import com.opensymphony.xwork2.ActionSupport; public class MapAction extends ActionSupport private Map map; public Map getMap() return map; public void setMap(Map map) this.map = m

20、ap; Override public String execute() throws Exception System.out.println(map); return null; 配置struts.xmlhtml view plain copy 在CODE上查看代码片派生到我的代码片 /login1.jsp /success.jsp /login2.jsp /success.jsp /login3.jsp /success.jsp 2自定义类深入剖析属性驱动模式一和模型驱动首先导入DOM4J、XPATH、BeanUtils的相关jar包在src下新建struts.xml新建自定义的Mode

21、lDrivern接口MyModelDrivernjava view plain copy 在CODE上查看代码片派生到我的代码片package cn.itcast; public interface MyModelDriven public T getModel(); 创建User类(和上面的一样).创建Action类java view plain copy 在CODE上查看代码片派生到我的代码片package cn.itcast.action; import cn.itcast.MyModelDriven; import cn.itcast.User; public class HelloA

22、ction implements MyModelDriven / 剖析模型驱动 private User user = new User(); public User getModel() return user; /* 属性驱动模式一 private String username; private String password; public String getUsername() return username; public void setUsername(String username) this.username = username; public String getPa

23、ssword() return password; public void setPassword(String password) this.password = password; */ public String say() System.out.println(user.getUsername() + + user.getPassword(); return good; 自定义拦截器(模仿Struts中的params拦截器)StrutsFilterjava view plain copy 在CODE上查看代码片派生到我的代码片package cn.itcast.filter; impo

24、rt java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletReque

25、st; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import mons.beanutils.BeanUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import cn.it

26、cast.MyModelDriven; public class StrutsFilter implements Filter public void init(FilterConfig filterConfig) throws ServletException public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException / 1.强转 HttpServletRequest request = (HttpServletR

27、equest) req; HttpServletResponse response = (HttpServletResponse) resp; / 2.操作 / 2.1 得到请求资源路径 String uri = request.getRequestURI(); String contextPath = request.getContextPath(); String path = uri.substring(contextPath.length() + 1); / System.out.println(path); / hello / 2.2 使用path去struts.xml文件中查找某一

28、个这个标签 SAXReader reader = new SAXReader(); try / 得到struts.xml文件的document对象。 Document document = reader.read(new File(this.getClass() .getResource(/struts.xml).getPath(); Element actionElement = (Element) document .selectSingleNode(/actionname= + path + ); / 查找这样的标签 if (actionElement != null) / 得到标签上的

29、class属性以及method属性 String className = actionElement.attributeValue(class); / 得到了action类的名称 String methodName = actionElement.attributeValue(method);/ 得到action类中的方法名称。 / 2.3通过反射,得到Class对象,得到Method对象 Class actionClass = Class.forName(className); Method method = actionClass.getDeclaredMethod(methodName)

30、; / 处理请求参数封装: Object actionObj = actionClass.newInstance(); / 2.模型驱动 if (actionObj instanceof MyModelDriven) MyModelDriven mmd = (MyModelDriven) actionObj; BeanUtils.populate(mmd.getModel(), request.getParameterMap(); else / 1.属性驱动 BeanUtils.populate(actionObj, request.getParameterMap();/ / 2.4 让method执行. String returnValue = (String) method.invoke(actionObj); / 是让action类中的方法执行,并获取方法的返回值。 / 2.5 / 使用returnValue去action下查找其子元素result的na

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论