1.异常映射的配置

当Action方法出错时Struts会返回异常错误信息页面,这种页面方式是不友好的,可以使用try-catch捕捉异常,然后在catch块中返回对应的错误页面。这种为单个<action>设置异常映射的方式称为局部异常映射。如果要让所有的<action>的各种异常发生时统一跳转到错误页面需要通过 <global-exception-mappings>设置全局异常映射。配置部分:

<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
       <exception-mapping result="error2" exception="java.sql.SQLException"></exception-mapping>
</global-exception-mappings>

在该配置中,如果该包发生java.lang.Exception异常将寻找<result>name="errror"跳转到对应的页面

2.全局结果的配置

每个Action中都可能遇到错误,此时为使页面友好,都需要跳转到一个公共页面,比较直观的方法是在struts.xml中为每个<action>都配置一个跳转到公共页面的<result>,但是这种做法在<action>多的情况下工作量很大。最好的办法是把<action>中相同的<result>提取出来,设置成全局结果。

代码部分:

<package name="base" abstract="true" extends="struts-default">
<global-results>
<result name="login">/page/login.jsp</result>
<result name="error">/page/comm/error.jsp</result>
<result name="error2">/page/comm/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
<exception-mapping result="error2" exception="java.sql.SQLException"></exception-mapping>
</global-exception-mappings>
</package>

上面的<package>base中设置了<global-results>这意味着在base包中所有的<action>中都有一个<result>name="error"。

抽象的包base继承 struts-default下面的包继承本包拥有了struts-default的配置和本包配置,其他包可以继承base包来达到不同页面不同包错误时跳转到相同页面。

 <package name="default" namespace="/" extends="base">
<action name="*HouserUserAction" class="com.house.action.HouserUserAction" method="{1}">
<result name="register_success">/page/login.jsp</result>
<result name="register_err">/page/regs.jsp</result>
<!-- 指定Action -->
<result name="login_success" type="redirectAction">
<param name="namespace">/house</param>
<param name="actionName">listHouserAction</param>
</result>
<result name="login_err">/page/login.jsp</result>
<!-- 动态结果 -->
<result name="input">/page/${inputResult}</result>
</action>
</package>
<package name="house" namespace="/house" extends="base">
<action name="*HouserAction" class="com.house.action.HouserAction" method="{1}">
<result>/page/guanli.jsp</result>
</action>
</package>                                                                                                                                                                                                                                                                                                 

3.动态结果

在配置<result>时,如果结果页面在配置时并不能确定,需要在运行时才能确定,例如在登陆和注册时使用数据验证失败时返回各自的初始页面<result>中只有一个name=“input”,这个时候需要使用动态结果来设置。

 public class HouserUserAction extends ActionSupport{
private User user;
private String inputResult;
public void validateLogin(){
if(user!=null){
if(user.getUname()==null||user.getUname().equals("")){
super.addFieldError("uname_err","用户名必须填写");
inputResult="login.jsp";
}
if(user.getUpwd()==null||user.getUpwd().equals("")){
super.addFieldError("upwd_err","密码必须填写");
}
}else{
super.addFieldError("login_err","用户信息不得为空");
}
}
public void validateReg(){
if(user!=null){
if(user.getUname()==null||user.getUname().equals("")){
super.addFieldError("uname_err","用户名必须填写");
inputResult="regs.jsp";
}
if(user.getUpwd()==null||user.getUpwd().equals("")){
super.addFieldError("upwd_err","密码必须填写");
}
}else{
super.addFieldError("login_err","用户信息不得为空");
}
} private UserService uService=new UserServiceImpl();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
} public String getInputResult() {
return inputResult;
}
public void setInputResult(String inputResult) {
this.inputResult = inputResult;
}
/**
* 处理login请求
* @return
*/
public String login(){
User users=uService.doLogin(user.getUname(), user.getUpwd());
if(users==null){
return "login_err";
}
//request,session,application
//获得上下文
ActionContext context=ActionContext.getContext();
//保存在session范围
Map sessionMap=context.getSession();
sessionMap.put("session_user", users);
return "login_success";
}
/**
* 处理reg请求
* @return
*/
public String reg(){
//制造错误测试exception-mapping
//User user=null;
int ret=uService.addUser(user);
if(ret>0){
return "register_success";
}
return "register_err";
}
}

在struts.xml配置如下

<!-- 动态结果 -->
<result name="input">/page/${inputResult}</result>

配置文件中使用表达式$(),有点类似el标签但是其属于OGNL表达式。

4.数据模块拆分

在大中型项目中,struts.xml文件将会变得非常庞大,难于管理。这时可以把struts.xml按照模块拆分成多个配置文件,并把他们放在rsc下,然后再使用<include>把它们组合在一起。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<package name="base" abstract="true" extends="struts-default">
<global-results>
<result name="login">/page/login.jsp</result>
<result name="error">/page/comm/error.jsp</result>
<result name="error2">/page/comm/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
<exception-mapping result="error2" exception="java.sql.SQLException"></exception-mapping>
</global-exception-mappings>
</package>
<include file="struts-house.xml"></include>
<include file="struts-user.xml"></include>
</struts>
 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<package name="default" namespace="/" extends="base">
<action name="*HouserUserAction" class="com.house.action.HouserUserAction" method="{1}">
<result name="register_success">/page/login.jsp</result>
<result name="register_err">/page/regs.jsp</result>
<!-- 指定Action -->
<result name="login_success" type="redirectAction">
<param name="namespace">/house</param>
<param name="actionName">listHouserAction</param>
</result>
<result name="login_err">/page/login.jsp</result>
<!-- 动态结果 -->
<result name="input">/page/${inputResult}</result>
</action>
</package>
</struts>
 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="house" namespace="/house" extends="base">
<action name="*HouserAction" class="com.house.action.HouserAction" method="{1}">
<!-- name dispatcher请求转发到JSP页面 -->
<result>/page/guanli.jsp</result>
</action>
</package>
</struts>

Struts2学习第四天——全局结果,动态结果及异常映射的更多相关文章

  1. Struts2学习(四)

    struts-defualt.xml指定的result的类型 1.struts-defualt.xml 文件的 181 行 开始定义了: <result-types> <result ...

  2. Struts2学习笔记四:深入拦截器

    一:拦截器的工作原理 拦截器的执行过程可以类比filter过滤器,ActionInvocation实例执行过程中,先执行action实例上引用的拦截器们,然后才执行action实例处理请求,返回res ...

  3. Struts2学习---基本配置,action,动态方法调用,action接收参数

    首先我们先来直接配置,然后再来讲原理: 第一步:jar包的引入: 我们可以到struts2的官网上下载: http://struts.apache.org/download.cgi#struts251 ...

  4. Struts2学习第四天——拦截器及文件上传

    1.概述 Struts2的很多核心功能都是由拦截器完成的. 拦截器很好的实现了AOP的编程思想,在动作的执行之前和结果的返回之后,做拦截处理. 2.struts2的默认拦截器栈 3.自定义拦截器 St ...

  5. Struts2学习笔记(四)——result结果类型

    当Action类的方法处理请求后,会返回一个字符串(逻辑视图名),框架根据这个结果码选择对应的result,向用户输出,所以需要在struts.xml提供<result>元素定义结果页面, ...

  6. Struts2学习笔记四 OGNL

    OGNL,全称为Object-Graph Navigation Language(对象图表达语言),它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,调用java对象的方法,同时能够自动 ...

  7. Struts2学习(四)———— ognl表达式、值栈、actionContext之间的关系

    一.什么是Ognl? 通过百度百科查询到的解释,其中详细的说明了OGNL的作用. 下面我们就对OGNL这5个作用进行讲解 1.存取对象的任意属性,简单说就是对javabean进行操作(重要) 2.调用 ...

  8. struts2学习笔记四

    一.contextMap中的数据操作 root根:List 元素1 元素2 元素3 元素4 元素5 contextMap:Map key value application Map key value ...

  9. salesforce 零基础学习(四十六)动态美观显示列表中记录的审批状态

    项目中,申请者申请某些事项以后,常常需要在申请列表中查看当前申请的记录所在的审批状态,动态美观的显示状态可以使UI更符合客户要求,比如下面这样. 以Goods__c表为例,申请者申请的一些采购以前需要 ...

随机推荐

  1. PHP chdir函数:改变当前的目录

    PHP chdir函数的作用是改变当前的目录,这里主机吧详细介绍下chdir函数的用法,并列举使用chdir函数的例子. chdir定义和用法: chdir() 函数改变当前的目录. chdir实例: ...

  2. Mac搭建kubernetes dashboard全流程

    1. 下载dashboard文件: curl -o kubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/das ...

  3. bitbucket 上公钥SSH key如何add key并进行项目运用

    前提:从sourcetree 添加项目时老是拉取不下来,查到原因是应为bitbucket需要SSH key公钥 目的:公钥相当于你在任何一台电脑只要有公钥授权就可以随时提交代码到服务器 原因: 1.很 ...

  4. J2EE十三个技术规范

    从事Java开发的童鞋都知道,java是一种非常棒的语言,能够实现跨平台运行.它屏蔽了具体的平台环境的要求,也就是说,无论是windows,还是Unix.Linux系统,只要支持Java虚拟机,就可以 ...

  5. linux环境下载和安装scala

    Linux下安装Scala和Windows下安装类似,步骤如下: 1.首先访问下载链接:http://www.scala-lang.org/download/默认这里下载的是Windows版本,这时点 ...

  6. ARCore中Pose类变换点的算法实现

    ARCore中Pose类变换点的算法实现,主要分为两步,分别是平移和旋转. 1. 旋转向量:通过四元数计算旋转后的向量 参数列表:q表示四元数, v是长度为4的float数组,表示待旋转的向量,   ...

  7. django 开发之前后端分离开发模式

    1. 什么是前后端分离开发的概念: 前端页面运行前端服务器上,负责页面的渲染(静态文件的加载)与跳转 后端代码运行在后端服务器上, 负责数据的处理(提供数据请求的接口) 2. 前后端分离开发碰到的问题 ...

  8. HttpWebResponse远程服务器返回错误: (500) 内部服务器错误 的解决办法

    在工作中用C#开发了一个小程序,不断访问去请求一个网站的页面,在循环过程中有时会报“远程服务器返回错误: (500) 内部服务器错误”,有时不会,出现的时机也不太一样.开始以为是网站的问题,后来网站是 ...

  9. 转: rem与px的转换

    rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个参考值,这个参考值设置为多少,完全可以根据您自己的需求来定.· 我们知道,浏览器默认的字号16px,来看一些px单 ...

  10. 微信小程序--动画animation

    js: list:[], contentflag:false   this.animation = wx.createAnimation({ duration: 500, timingFunction ...