struts.xml配置文件2_下

4.处理结果
Struts2的Action处理完用户请求后,将返回一个普通字符串,整个普通字符串就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图资源之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把对应的物理视图资源呈现给浏览者。
4.1.配置处理结果:
Struts2的Action处理用户请求结束后,返回一个普通字符串-逻辑视图名,必须在struts.xml文件中完成逻辑视图和物理视图资源的映射,才可让系统转到实际的视图资源。
Struts2通过在struts.xml文件中使用<result …/>元素来配置结果。Struts2提供了两种结果。
l 局部结果:将<result …/>作为<action …>元素的子元素配置。
l 全局结果:将<result …/>作为<global-results …>元素的子元素配置。
在package元素中配置<global-results>子元素:
<global-results>
<result name="error">/Error.jsp</result>
<result name="invalid.token">/Error.jsp</result>
<result name="login" type="redirect-action">Logon!input</result>
</global-results>
4.2.处理结果类型:
Struts2提供了对不同种类返回结果的支持,常见的有JSP,FreeMarker,Velocity等。
Struts2支持的不同类型的返回结果为:
名字 说明
chain 用来处理Action链
dispatcher 用来转向页面,通常处理JSP,这是默认的结果类型
freeMarker 处理FreeMarker模板
httpHeader 用来控制特殊的Http行为
redirect 重定向到一个URL
redirect-action 重定向到一个Action
stream 向浏览器发送InputSream对象,通常用来处理文件下载
velocity 处理Velocity模板
xslt 处理XML/XLST模板
plaintext 显示原始文件内容,例如文件源代码
tiles 结合Tile使用
另外第三方的Result类型还包括JasperReports Plugin,专门用来处理JasperReport类型的报表输出;Jfreechart Plugin;JSF Plugin。
4.3.动态返回结果
有些时候,只有当Action执行完毕的时候我们才知道要返回哪个结果,这个时候我们可以在Action内部定义一个属性,这个属性用来存储Action执行完毕之后的result值,例如:
private String nextAction;
public String getNextAction() {
   return nextAction;
}
在strutx.xml配置文件中,我们可以使用${nextAction}来引用到Action中的属性,通过${nextAction}表示的内容来动态的返回结果,例如:
<action name="fragment" class="FragmentAction">
<result name="next" type="redirect-action">${nextAction}</result>
</action>
上述Action的execute方法返回next的时候,还需要根据nextAction的属性来判断具体定位到哪个Action。
5.属性驱动和模型驱动
不管属性驱动还是模型驱动,Struts2框架都是通过拦截器负责提取请求参数,并将请求数据封装到相应的Action实例的属性或专门的模型的属性。
5.1.属性驱动:
属性驱动就是属性(property)作为贯穿MVC流程的信息携带者。简单的说,就是使用Action实例来封装请求参数和处理结果信息。前面我们做的示例都属于属性驱动模式。
5.2.模型驱动:
模型驱动就是使用单独的javaBean作为贯穿整个MVC流程的信息携带者。也就是说,使用单独的VO(值对象)来封装请求参数和处理结果信息。
示例:继续修改用户登录验证:
1. 新增一用户域模型对象:User.java
package org.qiujy.domain;
public class User {
private String userName ;
private String password ;
/**
* @return the userName
*/
public String getUserName() {
return userName ;
   }
/**
* @param userName the userName to set
*/
public void setUserName(String userName) {
this . userName = userName;
   }
/**
* @return the password
*/
public String getPassword() {
return password ;
   }
/**
* @param password the password to set
*/
public void setPassword(String password) {
this . password = password;
   }
}


2. 业务控制器:UserAction.java
package org.qiujy.web.struts2.action;
import org.qiujy.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
// 定义用于封装请求参数的模型对象
private User user = new User();
private String msg ; // 结果信息属性
/**
* @return the user
*/
public User getUser() {
return user ;
   }
/**
* @param user the user to set
*/
public void setUser(User user) {
this . user = user;
   }
/**
* @return the msg
*/
public String getMsg() {
return msg ;
   }
/**
* @param msg the msg to set
*/
public void setMsg(String msg) {
this . msg = msg;
   }
/**
* 处理用户请求的 login() 方法
* @return 结果导航字符串
* @throws Exception
*/
public String login() throws Exception{
       String userName = user .getUserName();
       String password = user .getPassword();
if ( "test" .equals(userName) && "test" .equals(password)){
msg = " 登录成功,欢迎 " + userName;
// 获取 ActionContext 实例,通过它来访问 Servlet API
           ActionContext context = ActionContext.getContext();
// session 中是否已经存放了用户名,如果存放了:说明已经登录了;否则说明是第一次登录成功
if ( null != context.getSession().get( "uName" )){
msg = userName + " :你已经登录过了 !!!" ;
           } else {
               context.getSession().put( "uName" , userName);
           }
return this . SUCCESS ;
       } else {
msg = " 登录失败,用户名或密码错 " ;
return this . ERROR ;
       }
   }
public String regist() throws Exception{
// 将用户名,密码添加到数据库中
//...
msg = " 注册成功。 " ;
return this . SUCCESS ;
   }
}


3. 配置文件:struts.xml
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< package name = "my" extends = "struts-default" namespace = "/manage" >
< action name = "userOpt" class = "org.qiujy.web.struts2.action.UserAction" >
< result name = "success" > /success.jsp </ result >
< result name = "error" > /error.jsp </ result >
</ action >
</ package >
</ struts >
4. 页面:
index.jsp
<%@ page language = "java" pageEncoding = "UTF-8" %>
< html >
< head >
< title > 用户登录页面 </ title >
</ head >
< body >
< h2 > 用户入口 </ h2 >
< hr >
< form action = "manage/userOpt!login.action" method = "post" >
< table border = "1" >
< tr >
< td > 用户名: </ td >
< td > < input type = "text" name = "user.userName" /> </ td >
</ tr >
< tr >
< td > 密码: </ td >
< td > <input type="password" name="user.password"/> </ td >
</ tr >
< tr >
< td colspan = "2" >
< input type = "submit" value = " 确定 " />
</ td >
</ tr >
</ table >
</ form >
</ body >
</ html >
其它页面略。
5. 运行效果:同以前一样。
6. 源代码:
6.Struts2的异常处理机制:
任何成熟的MVC框架都应该提供成就的异常处理机制。Strut2也不例外。Struts2提供了一种声明式的异常处理方式。Struts2也是通过配置的拦截器来实现异常处理机制的。
Struts2的异常处理机制通过在struts.xml文件中配置<exception-mapping …>元素完成的,配置该元素时,需要指定两个属性:
exception:此属性指定该异常映射所设置的异常类型。
result:此属性指定Action出现该异常时,系统转入result属性所指向的结果。
6.1.异常映射也分为两种:
l 局部异常映射:<exception-mapping…>元素作为<action…>元素的子元素配置。
l 全局异常映射:<exception-mapping…>元素作为<global-exception-mappings>元素的子元素配置。
6.2.输出异常信息:
使用Struts2的标签来输出异常信息:
l <s:property value="exception.message"/> : 输出异常对象本身。
l <s:property value="exceptionStack"/> : 输出异常堆栈信息。
6.3.示例:
还是修改用户登录示例:
1) 把UserAciton.java中的regist方法改成:
public String regist() throws Exception{
// 将用户名,密码添加到数据库中
//...
//msg = " 注册成功。 ";
if ( true ){
throw new java.sql.SQLException( " 没有数据库驱动程序 " );
      }
return this.SUCCESS;
   }
2) 修改struts.xml文件:
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< package name = "my" extends = "struts-default" namespace = "/manage" >
<!-- 定义全局处理结果 -->
< global-results >
<!-- 逻辑名为 sql 的结果,映射到 /exception.jsp 页面 -->
< result name = "sql" > /exception.jsp </ result >
</ global-results >
< global-exception-mappings >
<!-- Action 抛出 SQLException 异常时,转入名为 sql 的结果 -->
< exception-mapping exception = "java.sql.SQLException" result = "sql" />
</ global-exception-mappings >
< action name = "userOpt" class = "org.qiujy.web.struts2.action.UserAction" >
< result name = "success" > /success.jsp </ result >
< result name = "error" > /error.jsp </ result >
</ action >
</ package >
</ struts >
3) 新增一页面:exception.jsp
<%@ page language = "java" pageEncoding = "utf-8" %>
<%@ taglib uri = "/struts-tags" prefix = "s" %>
< html >
< head >
< title > 异常信息 </ title >
</ head >
< body >
< h2 >
出现异常啦
</ h2 >
< hr />
< h3 style = "color:red" >
<!-- 获得异常对象 -->
< s:property value = "exception.message" />
</ h3 >
< br />
<!-- 异常堆栈信息 -->
< s:property value = "exceptionStack" />
</ html >
4) 运行regist.jsp进行调试:


你可能感兴趣的:(字符串,用户,配置文件,package,元素)