Action只负责用户请求的处理,只是一个控制器,不能直接对用户的请求作出响应。当Action处理完请求后,处理结果应通过视图资源实现,但控制器应控制将哪个视图资源呈现给用户。
5.1 改进处理Action的处理结果
Action处理完请求后将返回一个字符串(是一个视图资源的逻辑名称)。Struts 2返回的视图资源是一个字符串。有利于Action与Struts 2框架分离,以便代码重用。
5.2 配置结果
Action在执行完请求后,会返回一个逻辑视图的名称,必须在struts.xml文件配置中进行逻辑与物理视图之间的映射才能让系统转到物理视图。
在struts.xml中配置<result/>元素来配置结果。分为两种类型:
局部结果:<result/>元素作为<action/>元素的子元素。
全局结果:<result/>元素作为<global-results/>的子元素。
<resultname="success" type="dispatcher">success.jsp</result> <result/>元素有两个属性:name-指定逻辑视图的名称,默认success;type-指定返回的视图资源类型,默认为dispatcher。 |
***通过请求参数指定结果:
配置<result/>元素可使用${0}的方式或${属性名}来指定视图资源,此处的属性名对应Action中的属性名。
<packagename="org"extends="struts-default"namespace="/"> <actionname="inputAction"class="com.InputAction"> <resultname="success">${jspName}.jsp</result> </action> </package> |
6.1 模型的作用
Struts 2的驱动模型不仅封装用户的请求参数,还封装Action的处理结果,这样的模式混乱,应采用单独的Model的实例来封装用户与Action的处理结果,这就是所谓的模型驱动。
模型驱动就是使用单独的JavaBean来贯穿这个MVC流程,与之相对应的属性模型驱动使用的属性贯穿这个MVC的流程,当然属性是无法单独存在的,必须依附于一个对象,这个对象就是Action实例。
模型驱动使用单独的VO(值对象)来封装用户的请求和处理结果。
6.2 使用模型驱动实现登录
/** * login.action采用模型驱动,采用模型驱动必须提供相应的模型, * 该模型就是一个简单的JavaBean,即User类 */ publicclass LoginAction extends ActionSupport implements ModelDriven<User>{ private User user=new User();//不必添加user的get/set方法 publicStringexecute(){ ActionContext ac = ActionContext.getContext(); if("admin".equals(user.getName().trim())&&"000".equals(user.getPass().trim())){ ac.put("success","登录成功"); return Action.SUCCESS; }else{ ac.put("error","用户名或密码错误!"); returnERROR; } } public User getModel() { returnuser; //必须返回一个模型对象,即User类的一个实例 } } |
简介
Struts 2提供了声明式异常处理。要使用Struts 2的异常处理机制,必须打开Struts 2的异常映射功能,因而必须配置一个拦截器,如下代码来自struts-default.xml,在配置中一句开启了异常映射功能:
<interceptors> <interceptorname="exception"class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/> <interceptorname="fileUpload"class="org.apache.struts2.interceptor.FileUploadInterceptor"/> <interceptor-stackname="basicStack"> <interceptor-refname="exception"/> </interceptor-stack> |
举例:
在LoginAction中进行声明式异常捕捉:
public String login(){ if("admin".equals(user.getName().trim())&&"000".equals(user.getPass().trim())){ return Action.SUCCESS; }else{ thrownew RuntimeException("用户名或密码错了"); //声明式异常捕捉 } } |
然后在struts.xml中添加异常代码配置:
在<action>标签中添加异常配置: <exception-mappingresult="error"exception="java.lang.RuntimeExcepetion"/> |
出现异常时的页面如下: