模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果。

一、使用模型驱动

1、login.action采用模型驱动模式实现,采用模型驱动时必须提供对应的模型,该模型就是一个普通的javabean。

UserBean.java

  1: package cc.openhome;
  2: public class UserBean {
  3:   private String username;
  4:   private String password;
  5:   private String tip;//封装处理结果的tip属性
  6:   public String getUsername() {
  7:     return this.username;
  8:   }
  9:   public void setUsername(String username) {
 10:     this.username = username;
 11:   }
 12:   public String getPassword() {
 13:     return this.password;
 14:   }
 15:   public void setPassword(String password) {
 16:     this.password = password;
 17:   }
 18:   public String getTip() {
 19:     return tip;
 20:   }
 21:   public void setTip(String tip) {
 22:     this.tip = tip;
 23:   }
 24: }

2、对于采用模型驱动的Action而言,该Action必须实现ModelDriven接口。

LoginAction.java

  1: package cc.openhome;
  2:
  3: import com.opensymphony.xwork2.Action;
  4: import com.opensymphony.xwork2.ModelDriven;
  5: public class LoginAction  implements Action,ModelDriven<UserBean>{
  6:   private UserBean model;
  7:
  8:   public UserBean getModel() {
  9:     return model;
 10:   }
 11:   public void setModel(UserBean model) {
 12:     this.model = model;
 13:   }
 14:
 15:   //处理用户请求的execute方法
 16:   public String execute() throws Exception{
 17:     if(getModel().getUsername().equals("nihao") &&
 18:         getModel().getPassword().equals("nihao")){
 19:       getModel().setTip("哈哈,服务器提示");
 20:       return SUCCESS;
 21:     }
 22:     else{
 23:       System.out.println("转换失败、、");
 24:       return ERROR;
 25:     }
 26:   }
 27: }
 28: 

3、登录页面login.jsp

  1: <%@ page language="java" contentType="text/html; charset=UTF-8"
  2:     pageEncoding="UTF-8"%>
  3: <%@ taglib prefix="s" uri="/struts-tags" %>
  4: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5: <html>
  6: <head>
  7:     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8:      <title><s:text name="login.title" /></title>
  9: </head>
 10: <body>
 11:   <s:form action="login" align="center">
 12:       <s:textfield name="username" key="user"/>
 13:       <s:password name="password" key="pass"/>
 14:       <s:submit value="登录" key="login"/>
 15:   </s:form>
 16: </body>
 17: </html>

3、success.jsp

  1: <%@ page language="java" contentType="text/html; charset=UTF-8"
  2:     pageEncoding="UTF-8"%>
  3: <%@ taglib prefix="s" uri="/struts-tags"%>
  4: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5: <html>
  6:   <head>
  7:     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8:     <title>成功界面</title>
  9:   </head>
 10:   <body>
 11:       <s:property value="model.tip"/>
 12:   </body>
 13: </html>

二、异常处理

MVC框架异常处理的流程:

     1、LoginAction.java

  1: package cc.openhome;
  2:
  3: import java.sql.SQLException;
  4: import com.opensymphony.xwork2.Action;
  5: import com.opensymphony.xwork2.ActionContext;
  6: import com.opensymphony.xwork2.ActionSupport;
  7:
  8: public class LoginAction extends ActionSupport implements Action {
  9:   private String username;
 10:   private String password;
 11:   public String getUsername() {
 12:     return username;
 13:   }
 14:   public void setUsername(String username) {
 15:     this.username = username;
 16:   }
 17:   public String getPassword() {
 18:     return password;
 19:   }
 20:   public void setPassword(String password) {
 21:     this.password = password;
 22:   }
 23:
 24:   public String execute() throws Exception {
 25:     // TODO Auto-generated method stub
 26:     ActionContext ctx=ActionContext.getContext();
 27:     if(getUsername().equalsIgnoreCase("root")){
 28:       throw new MyException("自定义异常");
 29:     }
 30:     if(getUsername().equalsIgnoreCase("sql")){
 31:       throw new SQLException("用户名不能为sql");
 32:     }
 33:
 34:     if(getUsername().equals("nihao") && getPassword().equals("nihao")){
 35:       ctx.getSession().put("user", getUsername());
 36:       //ctx.put("tip", getText("succTip",new String[]{username}));
 37:       return SUCCESS;
 38:     }else{
 39:       return ERROR;
 40:     }
 41:   }
 42: }

2、MyException.java

  1: package cc.openhome;
  2:
  3: public class MyException extends Exception {
  4:   public MyException (String eString){
  5:     super(eString);
  6:   }
  7: }
  8: 

3、登录页面login.jsp

  1: <%@ page language="java" contentType="text/html; charset=UTF-8"
  2:     pageEncoding="UTF-8"%>
  3: <%@ taglib prefix="s" uri="/struts-tags" %>
  4: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5: <html>
  6: <head>
  7:     <title><s:text name="login.title" /></title>
  8: </head>
  9: <body>
 10:   <s:form action="login" align="center">
 11:       <s:textfield name="username" key="user"/>
 12:       <s:password name="password" key="pass"/>
 13:       <s:submit value="登录" key="login"/>
 14:   </s:form>
 15: </body>
 16: </html>

4、struts.xml配置如下:

  1: <?xml version="1.0" encoding="UTF-8" ?>
  2: <!DOCTYPE struts PUBLIC
  3:   "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4:   "http://struts.apache.org/dtds/struts-2.3.dtd">
  5: <struts>
  6:     <global-results>
  7:       <result name="sql">/exception.jsp</result>
  8:       <result name="root">/exception.jsp</result>
  9:     </global-results>
 10:     <global-exception-mappings>
 11:       <exception-mapping exception="SQLException" result="sql"/>
 12:       <exception-mapping exception="Exception" result="root"/>
 13:     </global-exception-mappings>
 14:         <action name="login" class="cc.openhome.LoginAction">
 15:       <result name="success">/success.jsp</result>
 16:       <result name="error">/error.jsp</result>
 17:       <result name="input">/denglu.jsp</result>
 18:     </action>
 19: </struts>

5、exception.jsp(输出异常界面)

  1: <%@ page language="java" contentType="text/html; charset=UTF-8"
  2:     pageEncoding="UTF-8"%>
  3: <%@ taglib prefix="s" uri="/struts-tags"%>
  4: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5: <html>
  6:   <head>
  7:     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8:     <title>异常界面</title>
  9:   </head>
 10:   <body>
 11:       出现的问题是:<s:property value="exception.message"/><br>
 12:       <s:property value="exception"/>
 13:       <!--<s:property value="exception"/>-->
 14:   </body>
 15: </html>

6、运行结果

输出异常信息有两种方式:

<s:property value=”exception” />输出异常对象本身

<s:property value=”exceptionStack” />输出异常堆栈信息

       

Struts2 属性驱动、模型驱动、异常机制的更多相关文章

  1. 深入 Struts2 的配置 - 处理多个请求-处理请求结果-模型驱动-异常机制

    转:http://www.java3z.com/cwbwebhome/article/article2/2938.html?id=1631 本部分主要介绍struts.xml的常用配置. 1.1.   ...

  2. Struts2属性驱动与模型驱动

    为什么要使用属性驱动和模型驱动 struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获 ...

  3. struts2属性驱动模型

    属性驱动模型的作用: 因为struts2与servlet API 实现了解耦,无法直接使用HttpServlet Request对象获取表单提交的参数,但Struts2提供了属性驱动模型机制来解决这个 ...

  4. 2015年传智播客JavaEE 第168期就业班视频教程16-框架结构测试(加载全spring配置文件)+struts2属性驱动测试

    模块的规范化我们已经做完了,下面我们要做我们的功能了. 如果是模型驱动就是name="对应model的name" 如果用属性驱动的话,必须得把表现层(Action类)里面映射的用于 ...

  5. Struts2的属性驱动与模型驱动的区别

    1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...

  6. struts2 中属性驱动(其实就是struts2 action 中处理 request 的参数【old 方式servlet api 封装数据到javabean中(or beanutils)】),这里属性驱动是新方式

    1.属性驱动 a\  一般的set public class UserAction extends ActionSupport { private String username; private S ...

  7. Struts2中属性驱动与模型驱动

    属性驱动: 1.概念 能够利用属性驱动获取页面表单元素的内容 2.步骤 1.在action中声明属性,属性的名称和页面元素中name属性的值保持一致 2.action中的属性必须有set和get方法 ...

  8. Struts2(二)— Result结果配置、Servlet的API的访问、模型驱动、属性驱动

    一.Result结果配置 1.全局和局部结果 ​ 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为局部结果页面但是我们有时候在很多个action里 ...

  9. (九)Struts2模型驱动和属性驱动

    出于结构清晰的考虑,应该采用单独的Model实例来封装请求参数和处理结果,这就是所谓的模型驱动, 所谓模型驱动,就是使用单独的JavaBean来贯穿整个MVC流程. 所谓属性驱动,就是使用属性来作为贯 ...

随机推荐

  1. linux安装安卓开发工具android studio

    http://www.android-studio.org/ http://android-studio.org/index.php/docs/guide 最近要接触android编程,本来想装ecl ...

  2. POP音原因

    一,通话时调节音量,有POP音. POP音产生原因在于,音量变化太大导致有POP音,需要以淡入淡出的方式调节音量.请申请MOLY00108114 & MOLY00108143这两个Modem ...

  3. 如何删除要素类 IFeatureWorkspace 接口介绍(1)

    如何删除要素类 要想删除一个要素类,那么必须先得到这个,在得到这个要素类的时候,我们要学习一个新的接口IFeatureWorkspace. IFeatureWorkspace  接口介绍 这个接口主要 ...

  4. python2.7 与 go1.2简单性能比较

    过完年刚上班,项目还没有开始,对于即将到来的项目,想尝试是否可以找到一个开发效率接近python,运行效率接近静态语言的编程语言,选择基本就是scala和go,公司的技术组成基本都是c派的,scala ...

  5. JQuery中的相反的地方

    1.on和delegate的参数顺序相反 2.each和map参数也是相反的

  6. DRBD(数据镜像)+hearbeat(自动切换)

    DRBD 数据镜像软件 一.DRBD介绍 1.1.数据镜像软件DRBD介绍 分布式块设备复制(Distributed Relicated Block Deivce,DRBD),是一种基于软件.基于网络 ...

  7. ubuntu 系统 opencv3.1.0 安装

    opencv编译安装 编译环境安装: sudo apt-get install build-essential 必需包安装: sudo apt-get install cmake git libgtk ...

  8. Cocos2dx 3.1.1 学习笔记整理(2):创建场景与载入图片

    把之前用2.2.3的代码迁移到3.1.1真是个蛋疼的工作,话说3.1.1做的改动还真是大啊. 可以在HelloWorldScene.cpp中看到,之前的各种CCXXX都被废弃了. 例如,新建一个CCL ...

  9. WebRequest调用

    WebRequest支持不同的浏览器对象,可以在底层使用不同的XMLHttpRquest方式调用Web服务. Time.aspx <%@ Page Language="C#" ...

  10. Objective C HMAC-MD5

    - (NSString*) HMACWithSecret:(NSString*) secret andString:(NSString *)str { unsigned long encode = C ...