浅谈struts2

浅谈struts2一些配置

这篇文章也许是我在csdn上发表的第一篇,有时候真的感觉自己不会说什么,表达能力欠缺,从开始学习程序开始,对我最大的影响的就是csdn博客,我也是在上面看了很多的文章,也学到了很多大牛的分享,到目前为止,我也学到了一点,所以,我也想打算把我所知道的毫无保留的分享给大家,和大家学习。如果写的不好还请大家尽情吐槽。

一、action的基本配置

先不说那么多,先上配置文件struts2.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="user" extends="struts-default" namespace="/user">        
<action name="register" class="org.ztz.action.UserAction" method="register">
    <result name="success" type="redirect">/index.jsp</result>
</action>
<action name="login" class="org.ztz.action.UserAction" method="login">
    <result name="success" type="redirect">/index.jsp</result>
</action>
</package>
</struts>

这是一个最基本的struts2配置文件,
根标签是<struts/>
下一级是<package></package> 我们可以将不同的action分类,通过不同的包
包的属性:
name:包的名字,自己命名。
extends:继承,这个是默认的,不是自己命名的。
namespace:命名空间,如果设置了命名空间,访问时就应该在路径上添加上它
接着下一级就是<action/>了,
action的属性
name : 此 action的名字,访问该action通过 name.action,例如name=”register”,那么访问时就应该是 register.action , 如果有命名空间,例如上面的就应该为: /user/register.action
class:该action的类,是完整的类名,包名.类名,例如:org.ztz.action.UserAction
method:调用的方法,如果该Action实现了Action接口,默认调用excute()。
result标签:结果,name:方法的返回值,type:跳转类型, /index.jsp要跳转到的界面
下面是一个Action类的例子

package org.ztz.action;
import org.ztz.entity.User;
public class UserAction {
    private User user ; //实体类,设置setter(),getter()自动实例化,可直接使用
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public String login(){
        System.out.println("*********login()*********");
        return "success";
    }
    public String register(){
        System.out.println("*********register()*********");
        return "success";
    }
}

二、 通配符的使用:(可减少配置文件代码的冗余)
在(一)中已经了解了struts2的配置文件,里面有两个action,从这两个action中还没看的出代码
太多的冗余,但是他们的result的标签是完全一致的,在实际的开发中,result肯定不会只有一个,代码就会很多,甚至有时候有N多个action标签的返回值都非常相似,在这个时候使用通配符可大大减少代码量,下面来简单了解一下通配符的使用。
一个简单的action

<action name="login" class="org.ztz.action.UserAction" method="login">
    <result name="success" type="redirect">/index.jsp</result>
    <result name="failure" type="redirect">/failure.jsp</result>
    <result name="exception" type="redirect">/error.jsp</result>
</action>
<action name="register" class="org.ztz.action.UserAction" method="register">
    <result name="success" type="redirect">/index.jsp</result>
    <result name="failure" type="redirect">/failure.jsp</result>
    <result name="exception" type="redirect">/error.jsp</result>
</action>

上面的action配置,如果用通配符来表示的话,可以简写为如下

<action name="*Action" class="org.ztz.action.UserAction" method="{1}">
    <result name="success" type="redirect">/index.jsp</result>
    <result name="failure" type="redirect">/failure.jsp</result>
    <result name="exception" type="redirect">/error.jsp</result>
</action>

现在仅仅看这两个action是不是感到有点晕?下面来详细介绍一下。
* 代表一个或者多个字符,action中可以有一个 * 也可以有多个 *
method={1} 此method使用了表达式,表示该方法的名字是name中的第几个代表的字符(还会有 *_* 模式的通配符)。
但是,访问此action的时候就要注意了,例如访问上面的action就有无数种方式,因为代表的是一个或多个任意字符,例如 aAction.action 是可以访问,此时method的名字就是第一个 代表的字符a,在action中就会调用方法a。
bAction.action也可以访问,method的名字就是第一个 * 代表的字符 b,在action中就会调用方法b。
所以要想访问上面的login action就必须这样写了,路径为:“loginAction.action” 加粗部分是要调用的方法login,同理,访问register action 路径为:“registerAction.action”。
现在是不是感觉通配符大大减少了配置文件的代码量
上面仅仅是对aciton的属性method使用表达式了,除此之外,class和result也能使用表达式

<action name="login" class="org.ztz.action.LoginAction" method="login">
    <result name="success" type="redirect">/index.jsp</result>
    <result name="failure" type="redirect">/failure.jsp</result>
    <result name="exception" type="redirect">/error.jsp</result>
</action>
<action name="register" class="org.ztz.action.RegisterAction" method="register">
    <result name="success" type="redirect">/index.jsp</result>
    <result name="failure" type="redirect">/failure.jsp</result>
    <result name="exception" type="redirect">/error.jsp</result>
</action>

此配置文件和上面唯一不同是两个action不在同一个Action类中,此时就需要使用_模式的通配符了


<action name="*_*" class="org.ztz.action.{2}" method="{1}">
    <result name="success" type="redirect">/index.jsp</result>
    <result name="failure" type="redirect">/failure.jsp</result>
    <result name="exception" type="redirect">/error.jsp</result>
</action>

同理,访问login action的路径为“login_LoginAction.action”
访问register action的路劲为“register_RegisterAction.action”
result使用表达式就不再一一赘述了,方式一样,可以试一下

 <result name="success">/{1}.jsp</result>

三、Action访问Servlet API
Struts2的Action没有与任何Servlet API耦合,这是Struts2的一个改良之处,但是在Action中不访问Servlet API这是不现实的,在Web应用中通常访问的Servlet API的有三个:HttpServletRequest、HttpServeltSession、HttpServletContext。这三个接口分别对应JSP中的request、session、application三个内置对象。
Struts2提供了ActionContext类,可以通过该类访问Servlet API
ActionContext中的常用方法
static ActionContext getContext() 静态获取一个ActionContext实例,只有获得了该实例才能调用下面的非静态方法。
Object get(Object key)类似调用HttpServletRequest的getAttribute(String name)
Map getApplication返回一个Map对象,该对象模拟了该应用的ServletContext实例。
Map getSession() 返回一个Map对象,该对象模拟HttpSession对象
void setSession(Map map)传入一个Map实例,自动将该map中的键值对转化成session属性名和属性值。


四、Struts结果处理
在struts.xml文件中,result处理结果type属性的默认值为dispatcher,就是和Servlet中的forward跳转一样。还有redirect,同理,和Servlet中redirect跳转一致。
除此之外,还有chain,支持从一个Action跳转到另一个Action结果类型列表


五、处理异常:
由于应用是要和用户交互的,用户的输入又是不确定的,所以出现异常时很常见的事,在JSP中我们可以指定错误界面,那么在struts中我们应该如何捕获到异常并处理掉呢,与此同时,应该给用户反馈信息。
在struts中如果用户输入信息出现异常,我们首先想到会在Action中判断。
例如:一个登录Action,setter()和getter()方法省略。

public class LoginAction {  
    private String username ;
    private String password ;
    public String test() throws Exception{
        if(username.equals("ztz")){
            return "exception";
        }
        return "success";
    }
}

配置文件

<action name="loginAction" class="com.ztz.action.LoginAction" method="test">
    <result name="success">/index.jsp</result>
    <result name="exception">/exception.jsp</result>
</action>

我们可以通过发生异常就返回一个不同的结果,跳转到不同的界面,这样是可以的。
但是这种处理异常的方式是手动的,是非常繁琐的,每添加一个异常就要在页面中添加一个result来捕获,维护性非常不好,如果我们要改变异常处理方式,还需要修改Action代码。
所以,struts2提供了一中处理异常的机制,既可以批量处理异常,也可以针对某一个异常。
经过修改后,代码如下:

public class LoginAction {  
    private String username ;
    private String password ;
    public String test() throws Exception{
        if(username.equals("ztz")){  //假设用户名为ztz时出现异常
            throw new SQLException("数据库异常");
        }
        return "success";
    }
}

配置文件:

<global-results>
    <result name="sql">/sql_exception.jsp</result>
</global-results>
<global-exception-mappings>
    <exception-mapping result="sql" exception="java.sql.SQLException"/>
</global-exception-mappings>        
<action name="loginAction" class="com.ztz.action.LoginAction" method="test">
    <result name="success">/index.jsp</result>
</action>

上面是全局处理异常
在<global-exception-mapping>中出现java.sql.SQLException异常时,会返回sql,在通过<global-results/>中找到name为sql的<result/>跳转到sql_exception.jsp页面中。同时,我们还可以在sql_exception.jsp页面中获取异常信息。<head/>和<body/>省略了

<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<div class="all">
    <h1>SQLException异常</h1>
    输出异常对象本身<s:property value="exception"/>
     <hr/>
    输出异常堆栈信息<s:property value="exceptionStack"/>
     <hr/>
    异常信息<s:property value="exception.message"/>
</div>

注意:加粗代码一定要有,否则<s:property/>不能使用。
运行结果如下:
运行结果

当然,也可以设置局部变量,此时配置信息应该写到<action/>内部了

<action name="loginAction" class="com.ztz.action.LoginAction" method="test">
< exception-mappings>
    <exception-mapping result="sql" exception="java.sql.SQLException"/>
</ exception-mappings>  
<result name="sql">/sql_exception.jsp</result>
<result name="success">/index.jsp</result>
</action>

好了,目前,对struts才刚刚开始学习,还学的不是很深刻,目前就先写这么多了,希望能够给大家带来一些帮助。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值