Struts2 XML配置

MPU6050的四元数解算姿态方法 使用MPU6050硬件DMP解算姿态是非常简单的,下面介绍由三轴陀螺仪和加速度计的值来使用四元数软件解算姿态的方法。 我们先来看看如何用欧拉角描述一次平面旋转(坐标变换): MPU6050的四元数解算姿态方法 设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有。 转换成矩阵形式表示为: 即 所以从旋转到可以写成上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次: MPU6050的四元数解算姿态方法 上面得到了一个表示旋转的方 阅读详情

1. 深入Struts2的配置文件

本部分主要介绍struts.xml的常用配置。

1.1. 包配置:

Struts2框架中核心组件就是Action、拦截器等,Struts2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。
在struts.xml文件中package元素用于定义包配置,每个package元素定义了一个包配置。它的常用属性有:

名称作用
name必填属性,用来指定包的名字。
extends可选属性,用来指定该包继承其他包。继承其它包,可以继承其它包中的Action定义、拦截器定义等。
namespace可选属性,用来指定该包的命名空间。
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <!-- struts2的action必须放在一个指定的包空间下定义 -->
    <package name="default" extends="struts-default">
    <!-- 定义处理请求URL为login.action的Action -->
        <action name="login" class="org.qiujy.web.struts.action.LoginAction">
        <!-- 定义处理结果字符串和资源之间的映射关系 -->
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

如上示例的配置,配置了一个名为default的包,该包下定义了一个Action。

1.2. 命名空间配置:

考虑到同一个Web应用中需要同名的Action,Struts2以命名空间的方式来管理Action,同一个命名空间不能有同名的Action。
Struts2通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间。
把上示例的配置改为如下形式:

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <!-- struts2的action必须放在一个指定的包空间下定义 -->
    <package name="qiujy" extends="struts-default">
    <!-- 定义处理请求URL为login.action的Action -->
        <action name="login" class="org.qiujy.web.struts2.action.LoginAction">
        <!-- 定义处理结果字符串和资源之间的映射关系 -->
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>

    <package name="my" extends="struts-default" namespace="/manage">
    <!-- 定义处理请求URL为login.action的Action -->
        <action name="backLogin" class="org.qiujy.web.struts2.action.LoginAction">
        <!-- 定义处理结果字符串和资源之间的映射关系 -->
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

如上配置了两个包:default和my,配置my包时指定了该包的命名空间为/manage。
对于包default:没有指定namespace属性。如果某个包没有指定namespace属性,即该包使用默认的命名空间,默认的命名空间总是”“。
对于包my:指定了命名空间/manage,则该包下所有的Action处理的URL应该是“命名空间/Action名”。如上名为backLogin的Action,它处理的URL为:
http://localhost:8080/userlogin_struts2/manage/backLogin.action
Struts2的命名空间的作用等同于struts1里模块的作用。

1.3. 包含配置:

在Struts2中可以将一个配置文件分解成多个配置文件,那么我们必须在struts.xml中包含其他配置文件。

<struts>
    <include file="struts-default.xml"/>
    <include file="struts-user.xml"/>
    <include file="struts-book.xml"/>
    <include file="struts-shoppingCart.xml"/>   
    ......
</struts>

1.4. 拦截器配置:

见后面章节介绍。

1.5. 常量配置:

Struts2框架有两个核心配置文件,其中struts.xml文件主要负责管理应用中的Action映射, 及Action处理结果和物理资源之间的映射关系。除此之外,Struts2框架还包含了一个struts.properties文件,该文件主义了Struts2框架的大量常量属性。但通常推荐也是在struts.xml文件中来配置这些常量属性。
如:后面会讲到Struts2的国际化,它的资源文件位置就用常量属性来指定:

<struts>
    ......
    <constant name="struts.custom.i18n.resources" value="messages"/>
</struts>

表示指定了资源文件的放置在classes目录下,基本名是messages,则在classes目录下您就应该放置类似messages_zh_CN.properties,message_en.properties名的文件。

2. Struts2的Action

2.1. 实现Action类:

Struts2中Action是核心内容,它包含了对用户请求的处理逻辑,我们也称Action为业务控制器。
Struts2中的Action采用了低侵入式的设计,Struts2不要求Action类继承任何的Struts2的基类或实现Struts2接口。(但是,我们为了方便实现Action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用接口,提供了很多默认方法,这些默认方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等,这样可以大大的简化Action的开发。)
Struts2中通常直接使用Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,并且为属性提供对应的getter和setter方法。(当然,Action类中还可以封装处理结果,把处理结果信息当作一属性,提供对应的getter和setter方法)
修改第一部分的用户登录示例:把Action改成如下:

package org.qiujy.web.struts2.action;

import com.opensymphony.xwork2.ActionSupport;

/**
 *@authorqiujy
 *@version1.0
 */
publicclass LoginAction extends ActionSupport{
    private String userName;
    private String password;

    private String msg; //结果信息属性

    /**
     *@returnthemsg
     */
    public String getMsg() {
        returnmsg;
    }
    /**
     *@parammsgthemsgtoset
     */
    publicvoid setMsg(String msg) {
        this.msg = msg;
    }
    /**
     *@returntheuserName
     */
    public String getUserName() {
        returnuserName;
    }
    /**
     *@paramuserNametheuserNametoset
     */
    publicvoid setUserName(String userName) {
        this.userName = userName;
    }
    /**
     *@returnthepassword
     */
    public String getPassword() {
        returnpassword;
    }
    /**
     *@parampasswordthepasswordtoset
     */
    publicvoid setPassword(String password) {
        this.password = password;
    }

    /**
     *处理用户请求的excute()方法
     *@return结果导航字符串
     *@throwsException
     */
    public String execute() throws Exception{
       if("test".equals(this.userName) &&
"test".equals(this.password)){
           msg = "登录成功,欢迎" + this.userName;
           returnthis.SUCCESS;
       }else{
           msg = "登录失败,用户名或密码错";
           returnthis.ERROR;
       }
    }
}

往success.jsp和error.jsp页面中添加 ${msg} EL表达式来显示结果信息。则最终效果跟以前一样。

2.2. Action访问Servlet API:

Struts2中的Action并没有和任何Servlet API耦合,这样框架更具灵活性,更易测试。
但是,对于web应用的控制器而言,不访问Servlet API几乎是不可能的,例如跟踪HTTP Session状态等。Struts2框架提供了一种更轻松的方式来访问Servlet API。Struts2中提供了一个ActionContext类(当前Action的上下文对象),通过这个类可以访问Servlet API。下面是该类中提供的几个常用方法:

方法作用
public static ActionContext getContext()获得当前Action的ActionContext实例。
public Object get(Object key)此方法类似于调用HttpServletRequest的getAttribute(String name)方法。
public void put(Object key, Object value)此方法类似于调用HttpServletRequest 的setAttribute(String name, Object o)。
public Map getParameters()获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap() 方法。
public Map getSession()返回一个Map对象,该Map对象模拟了HttpSession实例。
public void setSession(Map session)直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名-属性值对。
public Map getApplication()返回一个Map对象,该对象模拟了该应用的ServletContext实例。
public void setApplication(Map application)直接传入一个Map实例,将该Map实例里的key-value对转换成application的属性名-属性值对。

修改以上用户登录验证示例的Action类中的execute方法:

public String execute() throws Exception{
        if("test".equals(this.userName) && "test".equals(this.password)){
            msg = "登录成功,欢迎" + this.userName;
            //获取ActionContext实例,通过它来访问Servlet API
            ActionContext context = ActionContext.getContext();
            //看session中是否已经存放了用户名,如果存放了:说明已经登录了;
//否则说明是第一次登录成功
            if(null != context.getSession().get("uName")){
                msg = this.userName + ":你已经登录过了!!!";
            }else{
                context.getSession().put("uName", this.userName);
            }

            returnthis.SUCCESS;
        }else{
            msg = "登录失败,用户名或密码错";
            returnthis.ERROR;
        }
    }
   Struts2中通过`ActionContext`来访问`Servlet API`,让Action彻底从`Servlet API` 中分离出来,最大的好处就是可以脱离Web容器测试Action。
   另外,Struts2中还提供了一个`ServletActionContext`类,Action只要继承自该类,就可以直接访问Servlet API。具体方法参看struts2的API文档。

3. 一个Action内包含多个请求处理方法的处理

Struts1提供了DispatchAction,从而允许一个Action内包含多个请求处理方法。Struts2也提供了类似的功能。处理方式主要有以下三种方式:

3.1. 动态方法调用:

DMI:Dynamic Method Invocation 动态方法调用。
动态方法调用是指:表单元素的action不直接等于某个Action的名字,而是以如下形式来指定对应的动作名:

<form method="post" action="userOpt!login.action">

则用户的请求将提交到名为”userOpt”的Action实例,Action实例将调用名为”login”方法来处理请求。同时login方法的签名也是跟execute()一样,即为public String login() throws Exception。
注意:要使用动态方法调用,必须设置Struts2允许动态方法调用,通过设置struts.enable.DynamicMethodInvocation常量来完成,该常量属性的默认值是false。

3.1.1. 示例:

修改用户登录验证示例,多增加一个注册用户功能。
1) 修改Action类:

package org.qiujy.web.struts2.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 *@authorqiujy
 *@version1.0
 */
publicclass LoginAction extends ActionSupport{
    private String userName;
    private String password;

    private String msg; //结果信息属性

    /**
     *@returnthemsg
     */
    public String getMsg() {
        returnmsg;
    }
    /**
     *@parammsgthemsgtoset
     */
    publicvoid setMsg(String msg) {
        this.msg = msg;
    }
    /**
     *@returntheuserName
     */
    public String getUserName() {
        returnuserName;
    }
    /**
     *@paramuserNametheuserNametoset
     */
    publicvoid setUserName(String userName) {
        this.userName = userName;
    }
    /**
     *@returnthepassword
     */
    public String getPassword() {
        returnpassword;
    }
    /**
     *@parampasswordthepasswordtoset
     */
    publicvoid setPassword(String password) {
        this.password = password;
    }

    /**
     *处理用户请求的login()方法
     *@return结果导航字符串
     *@throwsException
     */
    public String login() throws Exception{
        if("test".equals(this.userName) && "test".equals(this.password)){
            msg = "登录成功,欢迎" + this.userName;
            //获取ActionContext实例,通过它来访问Servlet API
            ActionContext context = ActionContext.getContext();
            //看session中是否已经存放了用户名,如果存放了:说明已经登录了;
//否则说明是第一次登录成功
            if(null != context.getSession().get("uName")){
                msg = this.userName + ":你已经登录过了!!!";
            }else{
                context.getSession().put("uName", this.userName);
            }

            returnthis.SUCCESS;
        }else{
            msg = "登录失败,用户名或密码错";
            returnthis.ERROR;
        }
    }

    public String regist() throws Exception{
        //将用户名,密码添加到数据库中
        //...
        msg = "注册成功。";
        returnthis.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">
    <!-- 定义处理请求URL为login.action的Action -->
        <action name="userOpt" class="org.qiujy.web.struts2.action.LoginAction">
        <!-- 定义处理结果字符串和资源之间的映射关系 -->
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

3) 页面:
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="userName"/></td>
         </tr>
         <tr>
             <td>密码:</td>
             <td><input type="password" name="password"/></td>
         </tr>
         <tr>
             <td colspan="2">
                 <input type="submit" value=" 确定 "/>
             </td>
         </tr>
    </table>
    </form>
 </body>
</html>
regist.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<html>
 <head>
    <title>用户注册页面</title>
 </head>

 <body>
  <h2>用户注册</h2>
  <hr>
    <form action="manage/userOpt!regist.action" method="post">
    <table border="1">
         <tr>
             <td>用户名:</td>
             <td><input type="text" name="userName"/></td>
         </tr>
         <tr>
             <td>密码:</td>
             <td><input type="password" name="password"/></td>
         </tr>
         <tr>
             <td colspan="2">
                 <input type="submit" value=" 注册 "/>
             </td>
         </tr>
    </table>
    </form>
 </body>
</html>

4) 运行结果:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

3.2. 为Action配置method属性:

将Action类中的每一个处理方法都定义成一个逻辑Action方法。

<!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="userLogin" class="org.qiujy.web.struts2.action.LoginAction" method="login">
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>

        <action name="userRegist" class="org.qiujy.web.struts2.action.LoginAction" method="regist">
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

如上,把LoginAction中的login和regist方法都配置成逻辑Action。要调用login方法,则相应的把index.jsp中表单元素的action设置为”manage/userLogin.action“;要调用regist方法,把regist.jsp中表单元素的action设置为”manage/userRegist.action“。

3.3. 使用通配符映射(wildcard mappings)方式:

在struts.xml文件中配置<action…>元素时,它的name、class、method属性都可支持通配符,这种通配符的方式是另一种形式的动态方法调用。
当我们使用通配符定义Action的name属性时,相当于用一个元素action定义了多个逻辑Action:

<action name="user_*"
class="org.qiujy.web.struts2.action.UserAction" method="{1}">
    <result name="success">/success.jsp</result>
    <result name="error">/error.jsp</result>
</action>

如上,<action name=”user_*”>定义一系列请求URL是user_*.action模式的逻辑Action。同时method属性值为一个表达式{1},表示它的值是name属性值中第一个*的值。例如:用户请求URL为user_login.action时,将调用到UserAction类的login方法;用户请求URL为user_regist.action时,将调用到UserAction类的regist方法。

4. 处理结果

Struts2的Action处理完用户请求后,将返回一个普通字符串,整个普通字符串就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图资源之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把对应的物理视图资源呈现给浏览者。

4.1. 配置处理结果:

Struts2的Action处理用户请求结束后,返回一个普通字符串-逻辑视图名,必须在struts.xml文件中完成逻辑视图和物理视图资源的映射,才可让系统转到实际的视图资源。
Struts2通过在struts.xml文件中使用<result …/>元素来配置结果。Struts2提供了两种结果。

结果配置
局部结果将<result …/>作为<action …>元素的子元素配置。
全局结果将<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。

常见使用总结:

result:配置跳转的页面

name:action执行方法之后的返回值有对应关系
标签中间:

1.直接写跳转地址(JSP)

  1. 如果直接写地址,受命名空间的保护
  2. 如果直接地址前加/,/代表了项目根目录

2.可以使用param标签配置(Action)

1.namespace
2.actionName
3.method

type:页面跳转的方式

1.请求转发:

1.请求转发到JSP:dispatcher
2.请求转发到Action:chain

2.重定向:

1.重定向到JSP:redirect(如何手动传参)
2.重定向到Action:redirectAction

3.流stream:

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;

publicclass User {
    private String userName;
    private String password;
    /**
     *@returntheuserName
     */
    public String getUserName() {
        returnuserName;
    }
    /**
     *@paramuserNametheuserNametoset
     */
    publicvoid setUserName(String userName) {
        this.userName = userName;
    }
    /**
     *@returnthepassword
     */
    public String getPassword() {
        returnpassword;
    }
    /**
     *@parampasswordthepasswordtoset
     */
    publicvoid 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;

publicclass UserAction extends ActionSupport{
    //定义用于封装请求参数的模型对象
    private User user = new User();

    private String msg; //结果信息属性

    /**
     *@returntheuser
     */
    public User getUser() {
        returnuser;
    }
    /**
     *@paramusertheusertoset
     */
    publicvoid setUser(User user) {
        this.user = user;
    }
    /**
     *@returnthemsg
     */
    public String getMsg() {
        returnmsg;
    }
    /**
     *@parammsgthemsgtoset
     */
    publicvoid setMsg(String msg) {
        this.msg = msg;
    }

    /**
     *处理用户请求的login()方法
     *@return结果导航字符串
     *@throwsException
     */
    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);
            }

            returnthis.SUCCESS;
        }else{
            msg = "登录失败,用户名或密码错";
            returnthis.ERROR;
        }
    }

    public String regist() throws Exception{
        //将用户名,密码添加到数据库中
        //...
        msg = "注册成功。";
        returnthis.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. 异常映射也分为两种:

一场映射配置
局部异常映射<exception-mapping…>元素作为<action…>元素的子元素配置。
全局异常映射<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进行调试:

转载自Struts2 XML配置详解

计算机网络基础:认识网络硬件与传输介质 计算机网络基础:认识网络硬件与传输介质,在计算机网络的庞大体系中,网络硬件与传输介质犹如坚实的骨架与脉络,支撑并承载着信息的流动。从家庭中的小型网络,到企业复杂的办公网络,再到覆盖全球的互联网,各类网络硬件设备各司其职,不同的传输介质发挥着独特的传输作用。它们相互协作,使得数据能够在不同设备之间快速、准确地传输,为人们的日常沟通、工作办公、娱乐休闲等活动提供了基础保障。 阅读详情

相关推荐

zemax显微镜设计

光学显微镜(Optical Microscope,简写OM)是利用光学原理,把人眼所不能分辨的微小物体放大成像,以供人们提取微细结构信息的。我这里是插入进来之后才反转,如果之前已经在目镜的单独文件夹反转过了就不用了。将目镜的焦距设定为25mm,通过缩放,然后将镜头调转过来。镜头数据中的曲率半径、物距像距都设置为变量。将镜头的焦距整体变为16.25mm。将孔径类型设置为按照光阑尺寸浮动。打开物镜的文件,选择插入镜头。由英国物理学家虎克制作。2、像空间孔径0.25。3、像面大小-0.9。

fendoudecheng的博客 8546

Struts2 校验(XML配置校验)

参考文档:    http://struts.apache.org/2.0.9/docs/ajax-client-side-validation.html    http://struts.apache.org/2.0.9/docs/pure-javascript-client-side-validation.html    http://struts.apache.org/2.0.9/docs/

Struts 2 的专栏 2万+

Dify如何实现自主学习

摘要:Dify通过构建感知-决策-执行-反馈的闭环实现"自主学习",本质是打造能自动获取信息、更新知识库并调整策略的Agent工作流。核心包括:1)建立知识库作为记忆体;2)搭建感知与执行工具获取实时信息;3)通过工作流编排决策"大脑",包含LLM决策节点、行动执行节点和反馈反思节点。典型应用如根据用户反馈优化回答风格,通过存储反思日志到知识库实现持续优化。这种机制使智能体能基于新数据和经验不断自我改进。

专注于技术研发行业技术主要有AI人工智能视觉识别、物联网技术、电商平台、app原生技术、微信小程序、鸿蒙语言开发、办公企业oa、ERP等,致力于做东半球最优秀的程序员 725

Struts2中struts.xml的Action配置详解(一)===》 struts2.0中struts.xml配置文件详解 (二)==》Struts2_struts.xml配置及例程三

struts2.0中struts.xml配置文件详解 二 Struts2中struts.xml的Action配置详解(一)  (2011-03-04 20:43:25) struts.xml文件结构 struts.xml文件是整个Struts2框架的核心。 struts.xml文件内定义了Struts2的系列Action,定义Actio

shenghua 3483

别再手动测接口了!用Pytest+Requests+Allure搭建你的第一个自动化框架(附完整源码)

本文详细介绍了如何使用Pytest+Requests+Allure搭建Python接口自动化测试框架,涵盖环境准备、核心组件封装、测试用例设计、报告生成及CI/CD集成等关键步骤。通过实战案例和完整源码,帮助开发者快速构建高效的接口自动化测试解决方案,提升测试效率和质量。

weixin_42546508的博客 320

搭建问答系统

数据描述 import docx import jieba from gensim.models import Word2Vec import os import numpy as np import pickle as pk import warnings from copy import deepcopy warnings.filterwarnings("ignore") from mu...

微信号:RunsenLiu 1840

struts2——struts.xml配置文件详解

在一些老旧项目里面struts2框架很常见,所有遇到老旧项目时很有必要学习一下

等风来的博客 5899

【史上最全面esp32教程】oled显示篇

esp32-arduino Oled屏幕的使用

m0_62599305的博客 1万+

【struts2】struts2配置文件—struts.xml

解决在断网环境下,配置文件无提示的问题: 我们可以看到Struts.xml在断网的情况下,前面有一个叹号,这时,我们按alt+/ 没有提示,这是因为” http://struts.apache.org/dtds/struts-2.0.dtd”是一个网络地址,如果上网的话,IDE会自动帮我们下载此文件,如果断网就没有办法了,但是我们还是有解决方法的. 首先在源码包里找到struts-2.0.dt...

lmb55的专栏 1074

QML实现ListView的拖动排序

现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2.4 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 Rectangle { width: 800 ...

草上爬的博客 7564

[Dify] 多步对话流程的实现技巧:构建连贯自然的多轮交互系统

摘要:本文探讨了AI系统中实现多轮对话的核心技术与应用方法。文章首先分析了多步对话的典型场景(如机票预订、财务报告生成)及其价值,提出了Dify平台实现该功能的三大机制:变量系统、条件控制和状态管理。随后详细介绍了顺序型、条件型和确认型三种基本对话模式,并通过"会议预约助手"案例展示了实际应用流程。文章还提供了提示词设计、变量引用等实用建议,并强调多轮对话成功的关键在于清晰的结构设计而非单纯依赖模型能力,最终实现自然流畅的人机交互体验。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1343

Struts2使用3-- Struts2的配置1-- web.xml 、struts.xml 配置

配置web.xml,配置Struts2的过滤器,例如: filter>    filter-name>struts2filter-name>    filter-class>org.apache.struts2.dispatcher.FilterDispatcherfilter-class>filter>filter-mapping>   

崇尚狼性的专栏 3916

Open3D 可视化(1)——简单可视化【2026最新版】

简单可视化,博客长期更新,本文最新更新时间为:2026年5月10日。

点云侠的博客 5685

struts2分模块进行配置xml注意的问题

主要是package不要相同,相同会导致其中一个会被另一覆盖的情况,简单来说,就是一个可以访问的到,另外一个访问会找不到的情况发生 struts.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Config...

码到家 222

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Struts2中struts.xml配置文件,result配置详解

Struts2中struts.xml配置文件,result配置详解。 Type类型值 作用说明 对应类 chain 用来处理Action链 com.opensymphony.xwork2.ActionChainResult dispatcher 用来转向页面,通常处理JSP org

徐守威 2394

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[Struts2] 配置文件struts.xml和web.xml详解

配置文件struts.xml和web.xml。 其实要s

gopain 3万+

Struts2 web.xml配置

一、Struts2配置文件 Struts2相关的配置文件有web.xml,struts.xml,struts.properties, struts-default.xml,velocity.properties,struts-default.vm。其中web.xml,struts.xml是必须的,其它的配置文件可选择。它们在web应用中的功能如下: web.xml:包含所有必须的框架组件的web部

iww0616的专栏 2155

Struts2 struts.xml配置

<struts> <package name="action" namespace="/" extends="struts-default"> <action name="LoginAction" class="action.LoginAction" method="execute"> &...

weixin_30895603的博客 219

Struts2.xml 中Constant的配置

struts2加载常量的顺序 struts-default.xml struts-plugin.xml struts.xml struts.properties web.xml 后面的会覆盖掉前面的常量,最好在struts.xml中定义   怎么由.action改为.do do或action Struts 2框架有两个核心配置文件,其中struts.xml文件主

4578

Struts2 配置 web.xml

Struts 2的基本配置 前面大致了解了Struts 2框架的基本内容,但这些基本内容都必须建立在Struts 2的配置文件基础之上,这些配置文件的配置信息也是Struts 2应用的核心部分。 3.5.1   配置web.xml文件 任何MVC框架都需要与Web应用整合,这就不得不借助于web.xml文件,只有配置在web.xml文件中Servlet才会被应用加载。 通常,所有的MVC框

专注Oracle EBS---低调的奢华 860

Struts2中struts.xml的Action、namespace配置详解

 今天做了个struts2练习,发现自己对struts.xml的action配置没有理解,如下图为项目大致结构: 首先是找不到struts.xml,发现             config                        struts-default.xml,struts.xml         也找不到struts.xml,我有换为/WEN-INF/classes

wrewrter的专栏 6749

struts2在web.xml的配置

注意点:如果web容器是J2EE1.3(servlet2.3)及以前的规范,由于不会自动加载struts的标签库,所以需要在web.xml文件中手动加载struts的标签库,文件名struts-tags.tld,一般放在WEB-INF下面,可以自己指定,在web.xml中配置的加载标签定义文件如下:   &lt;!-- 手动配置Struts 2的标签库 --&gt;   &lt;taglib&gt...

我的成长之路 202

struts2 2.5.2web.xml和struts.xmll配置

HelloWorld struts2 org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter struts2 /* index.jsp

qq_31540195的博客 1260

struts2核心配置之struts.xml

struts.xml   -常量配置   -包配置   -包含配置 一、常量配置 struts2常量的配置通常采用三种方式: 1、在struts.xml中使用<constant>元素配置常量 <struts> <constant name="struts.i18n.encoding" value="UTF-8"></c...

a597097186的博客 203

Web应用web.xml的Struts2的配置

<br />web.xml是web应用中加载有关servlet信息的重要配置文件,起着初始化servlet,filter等web程序的作用。通常,所有的MVC框架都需要Web应用加载一个核心控制器,那采取什么方法加载这样的核心控制器呢,servlet或filter成为了很好的选择,因为它们会随着web服务的启用而自动的载入。对于Struts 2框架而言,需要加载FilterDispatcher,只要Web应用负责加载FilterDispatcher,FilterDispatcher将会加载应用的Struts

onetree2010的专栏 7949

Struts2.5版本以上的struts.xml配置

由于Struts2的版本在不断的更新,对文件的配置要求也有了一些改变。 对于Struts2.5以上的版本如果需要url+!+方法访问Action某个方法的话需要在struts.xml加入如下语句 以上两句是DIM(动态访问犯法的配置) 有时候可以还会出现 Method 方法 for action Action is not allowed 这时候可能需要在struts.xml

菜鸟一个 1万+

struts2的struts的xml的配置方法

struts2的struts的xml的配置方法. web文件用于告诉服务器我用的是Struts的

m0_37609267的博客 173
上一篇: Struts2
下一篇: Java实现AES加密
sunbufu
博客等级 码龄11年 17粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值