Struts2框架详解

目录:
  • 1.Struts2的工作原理
  • 2.Struts2的搭建
  • 3.Struts2的核心文件
  • 3.1 Struts.xml配置详解
  • 4. Struts2重点
  • 4.1 动态方法调用
  • 4.2 多个配置文件
  • 4.3 Action搜索顺序
  • 4.4 从界面输入接收参数(登陆为例)
  • 4.5 处理并返回结果(响应前端页面)
  • 4.6 Action后缀设置
  • 4.7 访问Servlet API
  • 4.8 默认Action
  • 5.Struts2拦截器
  • 5.1 拦截器的定义
  • 5.2 拦截器的作用
  • 5.3 自定义拦截器
  • 5.4 内建拦截器
  • 5.5 拦截器的应用
  • 6.Struts2的标签
  • 7.Struts2的注解

    ---------------------------------------------------------------------------------------------------------------------------

    1.Struts2的工作原理

    ps: FilterDispatcher(2.1.3之前) 和StrutsPrepareAndExecuteFilter(2.1.3之后推荐使用)的区别主要是后者可以在过滤器之前添加自己的过滤器,如果在前者之前添加自定义拦截器,会失去对action的过滤作用

    2.Struts2的搭建

    2.1 新建WEB项目

    2.2导入struts jar包(9个包,包名如下,其他包的可以根据需要导入)

    2.3Bulid path添加依赖(右键项目选择Bulidpath->configure Bulid Path->add JARs)

    2.4 配置web.xml

    
    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    
      xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    
      <display-name>struts2</display-name>
    
      <filter>
    
      <filter-name>struts2</filter-name>
    
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    
    <!-- StrutsPrepareAndExecuteFilter是自2.1.3以后对FilterDispicther的替换 -->
    
      </filter>
    
      <filter-mapping>
    
      <filter-name>struts2</filter-name><!-- 此处的name和<filter>中的name一致 -->
    
      <url-pattern>/*</url-pattern>
    
      </filter-mapping>
    
      <welcome-file-list>
    
        <welcome-file>index.jsp</welcome-file>
    
      </welcome-file-list>
    
    </web-app>
    

    2.5 src下创建struts.xml

    
    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://jakarta.apache.org/struts/dtds/struts-config_2.3.dtd">
    
    <struts>
    
    <!--写相关配置-->
    
    </struts>
    

    2.6 src下创建action继承ActionSupport(例子)

    
    package com.struts2.action;
    
     
    
    import com.opensymphony.xwork2.ActionSupport;
    
     
    
    public class HelloWorldAction extends ActionSupport {
    
       @Override
    
       public String execute()throws Exception{
    
    	   System.out.println("执行Action");
    
    	return SUCCESS;
    
    	   
    
       }
    
    }
    

    2.7 struts.xml配置

    
    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://jakarta.apache.org/struts/dtds/struts-config_2.3.dtd">
    
    <struts>
    
    <package name="delfaut" namespace="/" extends="struts-default">
    
    <!--
    
    package:类似于java中的包
    
    name:包的名字,可以自定义
    
    namespace:书面值得命名空间,默认为‘/‘,如果未填,当你页面请求action时就会到根目录寻找包名为login下的action,如果你填写了namespace为‘/system‘,就会到相应的目录下寻找,如果没找到,还会到根目录下继续寻找对应的action,如果还是未找到就会报错
    
    extends:类似于java中的继承特征,extends="struts-default"就是继承struts-default.xml,它里面定义了许多跳转类型、拦截器等一些常用的东西
    
    -->
    
    <action name="struts2" class="com.struts2.action.HelloWorldAction">
    
    <result name="">/result.jsp</result>
    
    </action>
    
    </package>
    
    </struts>
    

    2.8  建result.jsp文件与<result name="">/result.jsp</result>的result.jsp一致

    
    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
    
    <%
    
    String path = request.getContextPath();
    
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    
    <html>
    
    <head>
    
    <base href="<%=basePath%>">
    
    <title>My JSP ‘result.jsp‘ starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    
    <meta http-equiv="cache-control" content="no-cache">
    
    <meta http-equiv="expires" content="0">
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    
    <meta http-equiv="description" content="This is my page">
    
    <!--
    
    <link rel="stylesheet" type="text/css" href="styles.css">
    
    -->
    
    </head>
    
    <body>
    
    This is my JSP page. <br>
    
    </body>
    
    </html>
    

    2.9 测试

    3.Struts2的核心文件
    3.1 Struts.xml配置详解
    
    <?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.xml配置包含
    
    	1.常量参数配置
    
    	2.文件包含导入配置
    
    	3.命名空间的配置
    
    	4.包的配置 
    
    	5.Action配置
    
    	6.拦截器配置
    
     -->
    
    <struts>
    
     
    
       <!--1.常量参数配置
    
       		参数主要设置一些struts的环境或者其他属性
    
       		可以在Struts2的核心配置文件struts.propertie配置导入
    
         -->
    
         
    
    	<!-- 设置action的扩展名 -->
    
    	<constant name="struts.action.extension" value="action" />
    
    	<!-- 设置默认编码 -->
    
    	<constant name="struts.i18n.encoding" value="utf8" />
    
    	<!-- 设置默认locale -->
    
    	<constant name="struts.locale" value="zh_CN" />
    
    	<!-- 设置国际化资源文件,多个文件用逗号隔开 -->
    
    	<constant name="struts.custom.i18n.resources" value="messageResourse" />
    
    	<!-- 设置struts默认ObjectFactory为spring -->
    
    	<constant name="struts.objectFactory" value="spring" />
    
    	<!-- 设置允许静态方法调用 -->
    
    	<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
    
    	<!-- 设置应用是否处于开发模式 -->
    
    	<constant name="struts.devMode" value="true" />
    
    	<!-- 设置默认主题 -->
    
    	<constant name="struts.ui.theme" value="simple" />
    
    	
    
    	<!--2.文件包含导入配置 
    
    		在struts2中配置文件可分为多个,我可以通过struts.xml来包含其他配置文件
    
    		file属性指定文件名
    
    	 -->
    
    	 
    
    	 <include file="struts-user.xml"/>
    
    	 
    
    	<!--3.命名空间的配置
    
    	 	考虑到struts2中可能会出现同名的Action,所以采用命名空间来区别
    
    	 	同一个命名空间不能出现名字相同的Action,我们通过在包中指定namespace
    
    	 	参数值来指定,如果未指定,默认为"",如果指定命名空间,访问action时候
    
    	 	需要在action name前添加命名空间,例如:http://localhost:8080/工程名/命名空间/Action名.后缀
    
    	 -->	 
    
    	 
    
    	<package name="default" extends="struts-default" namespace="test">
    
    		<action name="action_name" class="com.struts2.action.HelloWorldAction">
    
    			<result>/result.jsp</result>
    
    		</action>
    
    	</package>
    
    	 
    
    	 
    
    	<!--4.包的配置 
    
    		包配置中的属性:(1)name:指定包的名字,必填
    
    		(2)extends:指定包继承的包,可以继承其他包的Action定义和拦截器定义,可选
    
    		(3)namespace:指定包的命名空间,可选
    
    	  --> 
    
    	  
    
    	<package name="default" extends="struts-default" namespace="test">
    
    	
    
    		<!-- 定义全局result -->
    
    		<global-results>
    
    			<result name="返回值名">页面相对地址</result>
    
    		</global-results>
    
    		
    
    		<!-- 定义全局异常映射 -->
    
    		<global-exception-mappings>
    
    			<exception-mapping result="excption result"
    
    				exception="exception class" />
    
    		</global-exception-mappings>
    
    		
    
    		<!--5.Action配置
    
    			Action中的属性 
    
    			(1)name:指定action名,用于访问链接
    
    			(2)class:指定Action实现类的路径
    
    		  -->
    
    		  
    
    		<action name="sayhello" class="com.struts2.action.HelloAction">
    
    			<!-- 设置名为success的result -->
    
    			<result>/welcome.jsp</result>
    
    			<!--设置名为input的result -->
    
    			<result name="input">/index.jsp</result>
    
    			<!-- 在action中定义自定义和默认拦截器 -->
    
    			<interceptor-ref name="自定义拦截器名"></interceptor-ref>
    
    			<interceptor-ref name="defaultStack"></interceptor-ref>
    
    		</action>
    
    		
    
    		<!--6.拦截器配置 
    
    			
    
    		 -->
    
    		<!-- 配置自定义拦截器 -->
    
    		<interceptors>
    
    			<interceptor name="拦截器名" class="拦截器绝对地址"></interceptor>
    
    		</interceptors>
    
    	</package>
    
    	
    
    </struts> 
    
    4. Struts2重点
    4.1 动态方法调用

    4.1.1  指定method属性,与Action类中的方法名一致(一个方法需要添加一个Action,代码量相对比较多,不推荐使用)

    1)建立Action类HelloWorldAction.java

    
    package com.struts2.action;
    
     
    
    import com.opensymphony.xwork2.ActionSupport;
    
     
    
    public class HelloWorldAction extends ActionSupport {
    
     
    
    	/**
    
    	 * 
    
    	 */
    
    	private static final long serialVersionUID = 1L;
    
    	/**
    
    	 * Action默认调用该执行方法
    
    	 */
    
           @Override
    
       public String execute()throws Exception{
    
    	   System.out.println("execute方法执行了!");
    
    	return SUCCESS;
    
    	   
    
       }
    
        /**
    
         * add方法
    
         */
    
       public String add(){
    
    	   System.out.println("add方法执行了!");   
    
    	return SUCCESS;
    
       }
    
       /**
    
        * delete方法
    
        */
    
      public String delete(){
    
    	   System.out.println("delete方法执行了!");   
    
    	return SUCCESS;
    
      }
    
       
    
    }
    

    2)struts.xml配置如下

    
    <?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>	
    
     	<!-- 设置action的扩展名 -->
    
    	<constant name="struts.action.extension" value="action" />
    
     
    
    	
    
    	<package name="default" extends="struts-default" namespace="/">
    
            <!-- 对应默认的excute方法 -->
    
    		<action name="sayhello" class="com.struts2.action.HelloWorldAction">
    
    			<!-- 设置名为success的result -->
    
    			<result name="success">/default.jsp</result>
    
    		</action>
    
    		<!-- 对应add方法 -->
    
    		<action name="addAction" method="add" class="com.struts2.action.HelloWorldAction">
    
    			<result name="success">/add.jsp</result>
    
    		</action>
    
    		<!-- 对应delete方法 -->
    
    		<action name="deleteAction" method="delete" class="com.struts2.action.HelloWorldAction">
    
    			<result name="success">/delete.jsp</result>
    
    		</action>
    
    		
    
    	</package>
    
    	
    
    </struts> 
    

    3)add.jsp/delete.jsp/default.jsp页面可自行建立

    4.1.2 !(不推荐使用)

    1)建立Action类HelloWorldAction.java

    
    package com.struts2.action;
    
     
    
    import com.opensymphony.xwork2.ActionSupport;
    
     
    
    public class HelloWorldAction extends ActionSupport {
    
     
    
    	/**
    
    	 * 
    
    	 */
    
    	private static final long serialVersionUID = 1L;
    
    	/**
    
    	 * Action默认调用该执行方法
    
    	 */
    
           @Override
    
       public String execute()throws Exception{
    
    	   System.out.println("execute方法执行了!");
    
    	return SUCCESS;
    
    	   
    
       }
    
        /**
    
         * add方法
    
         */
    
       public String add(){
    
    	   System.out.println("add方法执行了!");   
    
    	return "add";
    
       }
    
       /**
    
        * delete方法
    
        */
    
      public String delete(){
    
    	   System.out.println("delete方法执行了!");   
    
    	return "delete";
    
      }
    
       
    
    }
    

    2)struts.xml配置如下

    
    <?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>	
    
     	<!-- 设置action的扩展名 -->
    
    	<constant name="struts.action.extension" value="action" />
    
    	<!-- 配置开启动态调用 -->
    
    	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    
    	
    
    	<package name="default" extends="struts-default" namespace="/">
    
    		<action name="sayhello" class="com.struts2.action.HelloWorldAction">
    
    			<!-- 设置名为success的result -->
    
    			<result name="success">/default.jsp</result>
    
    			<result name="add">/add.jsp</result>
    
    			<result name="delete">/delete.jsp</result>
    
    		</action>
    
    		
    
    	</package>
    
    	
    
    </struts> 
    

    3)页面可与上一种方法一致

    ps:访问路径:(1)http://localhost:8080/struts2/sayhello.action  (2)http://localhost:8080/struts2/sayhello!add.action 
    (3)http://localhost:8080/struts2/sayhello!delete.action

    4.1.3   通配符(推荐使用)

    1)Action类与第二种配置方式的代码一致

    2)struts.xml配置如下(ps:{1}表示第一个星号的位置,{2}表示第二个,以此类推)

    
    <?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>	
    
     	<!-- 设置action的扩展名 -->
    
    	<constant name="struts.action.extension" value="action" />
    
     
    
    	<package name="default" extends="struts-default" namespace="/">
    
    		<action name="*_*" method="{2}" class="com.struts2.action.{1}Action">
    
    			<!-- 设置名为success的result -->
    
    			<result name="success">/{2}.jsp</result>
    
    			<result name="add">/{2}.jsp</result>
    
    			<result name="delete">/{2}.jsp</result>
    
    		</action>
    
    		
    
    	</package>
    
    	
    
    </struts> 
    

    3)页面与2种配置的一致

    ps:访问路径:(1)http://localhost:8080/struts2/HelloWorld_delete.action 
     (2)http://localhost:8080/struts2/HelloWorld_add.action   (3)http://localhost:8080/struts2/HelloWorld_default.action

    4.2 多个配置文件

    当有很多Action的时候我们不可能全配置到struts.xml中,这样显得struts.xml极其臃肿,所以struts2提供了一种文件导入的功能

    我可以把每一个Action见一个xml文件通过<include file=""></include>指定导入。

    4.3 Action搜索顺序

    Action检索的顺序是按着从最长路径去查询是否有目标Action如果没有继续往上一级找,举个我访问sayhello.action的例子:

    第一步它会检索访问:http://localhost:8080/struts2/path1/path2/path3/sayhello.action ,如果找不到,第二步他会检索访问:http://localhost:8080/struts2/path1/path2/sayhello.action

    以此类推第三步会检索访问:http://localhost:8080/struts2/path1/sayhello.action

    4.4 从界面输入接收参数(登陆为例)

    4.4.1 从Action的属性接收

    1)login.jsp表单代码

    
    <form action="login.action" method="post">
    
    		用户名:<input type="text" id="username" name="username"><br> 密码:<input
    
    			type="password" id="password" name="password"><br> <input type="submit"
    
    			value="提交">
    
    </form>
    

    2)struts.xml配置

    
    <?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>	
    
     	<!-- 设置action的扩展名 -->
    
    	<constant name="struts.action.extension" value="action" />
    
    		
    
    	</package> -->
    
    	<package name="default" extends="struts-default" namespace="/">
    
    		<action name="login" method="login" class="com.struts2.action.LoginAction">
    
    			<result name="success">/welcome.jsp</result>
    
    		</action>
    
    	</package>
    
    	
    
    </struts> 
    

    4)LoginAction.java代码

    
    package com.struts2.action;
    
     
    
    import com.opensymphony.xwork2.ActionSupport;
    
     
    
    public class LoginAction extends ActionSupport {
    
    	private String username;
    
    	private String password;
    
    /*
    
     * 属性的get set方法
    
     */
    
    	public String getUsername() {
    
    		return username;
    
    	}
    
    	public void setUsername(String username) {
    
    		this.username = username;
    
    	}
    
    	public String getPassword() {
    
    		return password;
    
    	}
    
    	public void setPassword(String password) {
    
    		this.password = password;
    
    	}
    
    /*
    
     * 登陆方法
    
     */
    
    	public String login(){
    
    		System.out.println("用户名:"+username);
    
    		System.out.println("密码:"+password);
    
    		return "success";
    
    	}
    
     
    
    	
    
    }
    

    5)注:LoginAction.java中的属性要和login.jsp的表单name属性名称一致,同时LoginAction.java要实现属性的get/set方法

    4.4.2 从JavaBean接收

    1)login.jsp表单代码

    
    <form action="login.action" method="post">
    
    		用户名:<input type="text" id="username" name="user.username"><br> 密码:<input
    
    			type="password" id="password" name="user.password"><br> <input type="submit"
    
    			value="提交">
    
    	</form>
    

    2)struts.xml配置(同4.4.1)

    3)JavaBean User.java

    
    package com.struts2.bean;
    
     
    
    public class User {
    
    	private String username;
    
    	private String password;
    
    /*
    
     * 属性的get set方法
    
     */
    
    	public String getUsername() {
    
    		return username;
    
    	}
    
    	public void setUsername(String username) {
    
    		this.username = username;
    
    	}
    
    	public String getPassword() {
    
    		return password;
    
    	}
    
    	public void setPassword(String password) {
    
    		this.password = password;
    
    	}
    
    }
    

    4)LoginAction.java代码

    
    package com.struts2.action;
    
     
    
    import com.opensymphony.xwork2.ActionSupport;
    
    import com.struts2.bean.User;
    
     
    
    public class LoginAction extends ActionSupport {
    
    	private User user;
    
     
    
    	public User getUser() {
    
    		return user;
    
    	}
    
     
    
    	public void setUser(User user) {
    
    		this.user = user;
    
    	}
    
     
    
    	/*
    
    	 * 登陆方法
    
    	 */
    
    	public String login() {
    
    		System.out.println("用户名:" + user.getUsername());
    
    		System.out.println("密码:" + user.getPassword());
    
    		return "success";
    
    	}
    
     
    
    }
    

    6)注:注意LoginAction.java中的User并不是实例化一个User而是声明一个User类型的属性,并且实现get/set方法,同时还要注意表单提交时候name属性写成user.username的形式才会映射到JavaBean从而映射到Action,不过该方法不建议使用,因为不满足代码的低耦合,后端的更改会直接影响前端。

    4.4.3 从ModelDriven获取

    1)login.jsp表单代码(同4.4.1)

    2)struts.xml配置(同4.4.1)

    3)JavaBean User.java(同4.4.2)

    4)LoginAction.java代码

    
    package com.struts2.action;
    
     
    
    import com.opensymphony.xwork2.ActionSupport;
    
    import com.opensymphony.xwork2.ModelDriven;
    
    import com.struts2.bean.User;
    
     
    
    public class LoginAction extends ActionSupport implements ModelDriven<User> {
    
    	private User user = new User();
    
     
    
    	/*
    
    	 * 登陆方法
    
    	 */
    
    	public String login() {
    
    		System.out.println("用户名:" + user.getUsername());
    
    		System.out.println("密码:" + user.getPassword());
    
    		return "success";
    
    	}
    
    /**
    
     * 继承自接口ModelDriven得方法
    
     * @return User
    
     */
    
    	@Override
    
    	public User getModel() {
    
    		return user;
    
    	}
    
     
    
    }
    

    5)注:此方法获取参数需要在LoginAction.java中实现ModelDriven接口,同时重写getModel()方法,注意这里的User需要实例化,并不是仅仅声明一个变量,与4.4.2是有区别的。

    4.4.4 获取Servlet API通过Servlet方法获取参数

    1)注:访问Servlet API的方法下面会说到,至于Servlet如何获取请求数据,可以单独学习Servlet进行了解学习

    4.5 处理并返回结果(响应前端页面)

    注:处理并返回结果前端接收,这里涉及两个方面,一是后端,后端接收/返回数据的方法有:1)通过访问Servlet API放回数据 ;2)通过action的JavaBean/ModelDriven映射

    二是前端,前端接收/提交数据的方法有:1)jsp运用java代码访问Servlet内置对象;2)EL表达式; 3)OGNL表达式  4)struts2标签     5)AJAX异步请求

    ps:后面会有一种Struts注解映射的方式。

    4.6 Action后缀设置

    1)struts.xml配置

    
    <!-- 设置action的扩展名 -->
    
    <constant name="struts.action.extension" value="action" />
    

    2)注:配置扩展后缀还可以在struts.properties和web.xml中配置,同时不配置的话默认为.action和不加后缀都可访问,如果配置了后缀访问时不加后缀会出错,同时也可以配置多个后缀以逗号分隔。

    4.7 访问Servlet API

    4.7.1 通过ActionContext访问

    
    //Map<String, Object> application = ActionContext.getContext().getApplication();
    
    Map<String, Object> application1 = (Map<String, Object>) ActionContext.getContext().get("application");
    
    //Map<String, Object> session=ActionContext.getContext().getSession();
    
    Map<String, Object> session1 = (Map<String, Object>) ActionContext.getContext().get("session");
    
    Map<String, Object> request1= (Map<String, Object>) ActionContext.getContext().get("request");		
    

    4.7.2 通过实现***Aware接口访问

    
    package com.struts2.action;
    
     
    
    import java.util.Map;
    
     
    
    import javax.servlet.http.HttpServletRequest;
    
    import javax.servlet.http.HttpServletResponse;
    
    import javax.xml.ws.Response;
    
     
    
    import org.apache.struts2.ServletActionContext;
    
    import org.apache.struts2.interceptor.ApplicationAware;
    
    import org.apache.struts2.interceptor.ServletRequestAware;
    
    import org.apache.struts2.interceptor.ServletResponseAware;
    
    import org.apache.struts2.interceptor.SessionAware;
    
     
    
    import com.opensymphony.xwork2.ActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    import com.opensymphony.xwork2.ModelDriven;
    
    import com.struts2.bean.User;
    
     
    
    public class LoginAction extends ActionSupport implements ModelDriven<User>,
    
    		ServletRequestAware, ServletResponseAware, SessionAware,
    
    		ApplicationAware {
    
    	private User user = new User();
    
    	private HttpServletRequest request;
    
    	private Map<String, Object> application;
    
    	private HttpServletResponse response;
    
    	private Map<String, Object> session;
    
    	/*
    
    	 * 登陆方法
    
    	 */
    
    	public String login() {
    
    		
    
    		application.put("application", "application data");
    
    		request.setAttribute("request", "request data");
    
    		session.put("session", "session");
    
    		return "success";
    
    	}
    
     
    
    	/**
    
    	 * 继承自接口ModelDriven得方法
    
    	 * 
    
    	 * @return User
    
    	 */
    
    	@Override
    
    	public User getModel() {
    
    		return user;
    
    	}
    
     
    
    	/**
    
    	 * 继承自接口ApplicationAware得方法
    
    	 */
    
    	@Override
    
    	public void setApplication(Map<String, Object> arg0) {
    
    		application =arg0;
    
    	}
    
     
    
    	/**
    
    	 * 继承自接口SessionAware得方法
    
    	 */
    
    	@Override
    
    	public void setSession(Map<String, Object> arg0) {
    
    		session =arg0;
    
    	}
    
     
    
    	/**
    
    	 * 继承自接口ServletResponseAware得方法
    
    	 */
    
    	@Override
    
    	public void setServletResponse(HttpServletResponse arg0) {
    
    		response =arg0;
    
    	}
    
     
    
    	/**
    
    	 * 继承自接口ServletRequestAware得方法
    
    	 */
    
    	@Override
    
    	public void setServletRequest(HttpServletRequest arg0) {
    
    		request =arg0;
    
    	}
    
     
    
    }
    

    4.7.3 通过ServletActionContext访问

    
    	// 获得HttpServletRequest对象
    
    		HttpServletRequest request = ServletActionContext.getRequest();
    
    		// 获得HttpServletResponse对象
    
    		HttpServletResponse response = ServletActionContext.getResponse();
    
    		// 获得HttpSession对象
    
    		HttpSession session = ServletActionContext.getRequest().getSession();
    
    		// 获得ServletContext对象
    
    		ServletContext application = ServletActionContext.getServletContext();		
    

    4.7.4 注:可能小伙伴们会有疑问,干嘛要访问Servlet API?有啥作用呢?如果不懂Servlet当然是不清楚了,通过访问Servlet我们可以进行前后端数据的交互,实现用户的请求与响应

    4.8 默认Action

    注:默认Action的作用是为了用户友好,增加用户体验,当用户找不到访问路径资源路径的时候,返回给他一个错误提示页面,增加用户体验。

    配置如下:

    
    		<package name="default" extends="struts-default" namespace="/">
    
    		<!-- 注意这里的 name参数,要和下面action的name值保持一致-->
    
    		<default-action-ref name="error"></default-action-ref>
    
    		<!-- 全局默认action可以执行相应的Action操作,也可以直接放回某个页面 -->
    
    		<action name="error" >
    
    			<result>/error.jsp</result>
    
    		</action>
    
    	</package>
    
    5.Struts2拦截器
    5.1 拦截器的定义

    在action执行前拦截用户的某些请求并执行某些操作的的组件称为拦截器,多个拦截器就组成了拦截器栈。(类似于web中的过滤器)

    5.2 拦截器的作用

    1) 数据转移;2)类型转换;3)数据校验;3)用户权限校验

    5.3 自定义拦截器

    5.3.1 通过实现Interceptor接口实现自定义拦截器

    1)搭建好Struts2框架

    2)建立登陆页面login.jsp

    
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    <%
    
    	String path = request.getContextPath();
    
    	String basePath = request.getScheme() + "://"
    
    			+ request.getServerName() + ":" + request.getServerPort()
    
    			+ path + "/";
    
    %>
    
     
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    
    <html>
    
    <head>
    
    <base href="<%=basePath%>">
    
     
    
    <title>My JSP ‘login.jsp‘ starting page</title>
    
     
    
    <meta http-equiv="pragma" content="no-cache">
    
    <meta http-equiv="cache-control" content="no-cache">
    
    <meta http-equiv="expires" content="0">
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    
    <meta http-equiv="description" content="This is my page">
    
    </head>
    
     
    
    <body>
    
    	<form action="login.action" method="post">
    
    		用户名:<input type="text" id="username" name="username"><br> 密码:<input
    
    			type="password" id="password" name="password"><br> <input type="submit"
    
    			value="提交">
    
    	</form>
    
    </body>
    
    </html>
    

    3)拦截器MyInterceptor.java继承Intercepter

    
    package com.struts2.Interceptor;
    
     
    
    import com.opensymphony.xwork2.ActionInvocation;
    
    import com.opensymphony.xwork2.interceptor.Interceptor;
    
     
    
    @SuppressWarnings("serial")
    
    public class MyInterceptor implements Interceptor{
    
     
    
    	@Override
    
    	public void destroy() {
    
    		
    
    	}
    
     
    
    	@Override
    
    	public void init() {
    
    		
    
    	}
    
     
    
    	@Override
    
    	public String intercept(ActionInvocation invocation) throws Exception {
    
    		//执行action之前执行的操作
    
    		long startTime = System.currentTimeMillis();
    
    		System.out.println("执行action之前执行intercept执行操作");
    
            //执行之后的拦截器,如果没有则执行action操作
    
    
    		String result = invocation.invoke();
    
    		//执行action之后执行的操作
    
    		long endTime = System.currentTimeMillis();
    
    		System.out.println("执行action之后执行intercept执行操作");
    
    		System.out.println("执行action花费的时间:"+(endTime-startTime));
    
    		return result;
    
    	}
    
     
    
    }
    

    4.实现LoginAction.java

    
    package com.struts2.action;
    
     
    
    import java.util.Map;
    
     
    
    import javax.servlet.ServletContext;
    
    import javax.servlet.http.HttpServletRequest;
    
    import javax.servlet.http.HttpServletResponse;
    
    import javax.servlet.http.HttpSession;
    
    import javax.servlet.jsp.PageContext;
    
    import javax.xml.ws.Response;
    
     
    
    import org.apache.struts2.ServletActionContext;
    
    import org.apache.struts2.interceptor.ApplicationAware;
    
    import org.apache.struts2.interceptor.ServletRequestAware;
    
    import org.apache.struts2.interceptor.ServletResponseAware;
    
    import org.apache.struts2.interceptor.SessionAware;
    
     
    
    import com.opensymphony.xwork2.ActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    import com.opensymphony.xwork2.ModelDriven;
    
    import com.struts2.bean.User;
    
     
    
    public class LoginAction extends ActionSupport implements ModelDriven<User> {
    
    	private User user = new User();
    
    	/*
    
    	 * 登陆方法
    
    	 */
    
    	public String login() {
    
    		// 获得HttpServletRequest对象
    
    		HttpServletRequest request = ServletActionContext.getRequest();
    
    		// 获得HttpServletResponse对象
    
    		HttpServletResponse response = ServletActionContext.getResponse();
    
    		// 获得HttpSession对象
    
    		HttpSession session = ServletActionContext.getRequest().getSession();
    
    		// 获得ServletContext对象
    
    		ServletContext application = ServletActionContext.getServletContext();
    
    		
    
    		application.setAttribute("application", "application data");
    
    		request.setAttribute("request", "request data");
    
    		session.setAttribute("session", "session");
    
    		// 放到request作用域中
    
    		ActionContext.getContext().put("value", "附加参数");
    
    		// 获取用户名请求参数
    
    		System.out.println("用户名:" + user.getUsername());
    
    		System.out.println("密码:" + user.getPassword());
    
    		return "success";
    
    	}
    
     
    
    	/**
    
    	 * 继承自接口ModelDriven得方法
    
    	 * 
    
    	 * @return User
    
    	 */
    
    	@Override
    
    	public User getModel() {
    
    		return user;
    
    	}
    
     
    
     
    
    }
    

    上面需要 User的javabean,之前有实现,可参看之前的代码

    5. Struts.xml的配置(注意拦截器的配置)

    
    <?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>
    
    	<!-- 设置action的扩展名 -->
    
    	<constant name="struts.action.extension" value="action" />
    
     
    
    	<package name="default" extends="struts-default" namespace="/">
    
    		<!-- 注册拦截器 -->
    
    		<interceptors>
    
    			<interceptor name="myInterceptor" class="com.struts2.Interceptor.MyInterceptor">
    
    			</interceptor>
    
     
    
    		<!-- 定义拦截器栈,加入默认拦截器 -->
    
    		<interceptor-stack name="myStack">
    
    				<interceptor-ref name="defaultStack"></interceptor-ref>
    
    				<interceptor-ref name="myInterceptor"></interceptor-ref>
    
    			</interceptor-stack>
    
    		</interceptors>
    
     
    
     
    
    		<action name="login" method="login" class="com.struts2.action.LoginAction">
    
    			<!-- 应用拦截器栈-->
    
    			<interceptor-ref name="myStack"></interceptor-ref>
    
    			<result name="success">/welcome.jsp</result>
    
    		</action>
    
    	</package>
    
     
    
    </struts> 
    

    ps:如果不加入默认的拦截器,可能会出现前端数据无法映射到后端的情况,当然如果仅仅是数据无法映射,可以在对应action或者拦截器栈中加入如下拦截器

    <interceptor-ref name="params" />

    5.3.2  继承AbstractInterceptor类实现自定义拦截器

    继承AbstractInterceptor类的实现方法和上一种方法基本相同,唯一不同的是拦截器类MyInterceptor.java的实现,具体区别可见代码

    
    package com.struts2.Interceptor;
    
     
    
    import com.opensymphony.xwork2.ActionInvocation;
    
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    
     
    
    @SuppressWarnings("serial")
    
    public class MyInterceptor extends AbstractInterceptor {
    
     
    
    	@Override
    
    	public String intercept(ActionInvocation invocation) throws Exception {
    
    		// 执行action之前执行的操作
    
    		long startTime = System.currentTimeMillis();
    
    		System.out.println("执行action之前执行intercept执行操作");
    
            //执行之后的拦截器,如果没有则执行action操作
    
    		String result = invocation.invoke();
    
    		// 执行action之后执行的操作
    
    		long endTime = System.currentTimeMillis();
    
    		System.out.println("执行action之后执行intercept执行操作");
    
    		System.out.println("执行action花费的时间:" + (endTime - startTime));
    
    		return result;
    
    	}
    
     
    
    }
    

    上面两种方法的结果一致,具体实现可以看控制台的输出:

    5.4 内建拦截器

    注:内建的拦截器可以在struts2-core-2.3.9.jar包下的struts2-default.xml文件中查看

    参看:常见内建拦截器的作用

    ps:拦截器的应用需要注意顺序,同时如果没有指定拦截器struts会继承使用默认的拦截器栈,如果用户有自定义的拦截器时,默认拦截器需要显式调用,否则无效。

    5.5 拦截器的应用
    6.Struts2的标签
    7.Struts2的注解
  • 时间: 2024-10-05 07:57:14

    Struts2框架详解的相关文章

    【SSH2(理论篇)】--Struts2配置详解

    上篇博客讨论了SSH2框架模型,在开发过程中发现SSH2的开发模型其实类似于经典的三层模式,在每一层中分别添加了不同的框架,显示层使用的是Struts2进行配置的,业务逻辑层使用的是Spring配置,数据持久层则采用的是Hibernate,开发模式简单易懂,接下来将会分别从三层着手讨论每一层的运行内容. 一.Struts体系简介 struts,是Apache软件基金会(ASF)赞助的一个开源项目,它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-V

    eclipse Indigo搭建SSH框架详解

    SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一步:准备工作.   下载好eclipse,Struts2,Spring,Hibernate.   1.eclipse:eclipse下载的时候建议下载JavaEE版的eclipse.                 当然你也可以下载eclipse-SDK.(下载eclipse-SDK需要下载Web,Tomcat等plugins)   2.Struts2:http://str

    J2EE学习篇之--Struts2技术详解

    前面说到了Struts1的相关知识,下面来说一下Struts2的相关知识,我们知道现在Struts2使用的比Struts1多,Struts2已经替代Struts1成为主流的框架了... 摘要 Struts2是在WebWork2基础发展而来的.和struts1一样, Struts2也属于MVC框架.不过有一点大家需要注意的是:尽管Struts2和Struts1在名字上的差别不是很大,但Struts2和struts1在代码编写风格上几乎是不一样的.那么既然有了struts1,为何还要推出struts

    Struts2配置详解_配置Action

    Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法. public String execute() throws Exception Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方

    Struts2配置详解

    1.Namespace 1)namespace决定action的访问路径,默认为“”,可以接受所有路径的Action:       2)namespace可以写为/,或者/xxx,或者/xxx/yyy,对应action访问路径为/index.action,/xxx/index.action或者/xxx/yyy/index.action       3)namespace最好也用模块来进行命名 当url中输入不存在的Action的时候,定向到默认的Action 1.1 struts2配置详解 1.

    MTK平台LCD驱动框架详解(一)

    许多学习嵌入式的进入MTK开发平台,很多东西都会感到很陌生.在MTK平台上你可以简简单单几分钟就点亮一块屏.加上MTK快速开发的节奏,也很少有时间自己整理学习.如果不思进取,不加班加点学习.很容易就慢慢--.这也难怪有些人说MTK造就了一批懒人,毁掉了一批工程师.但其实都是基于linux开发,核心的东西都是一样一样的.我刚入行业,在迷茫之际,自己整理跟踪源码.想慢慢找回自己熟悉的感觉,掌握MTK的整体框架.也希望能给有需要的人带来些帮助.好吧!前话说到这,开始正题. 本文肯定有不少地方会出现错误

    jQuery Validate验证框架详解

    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type="text/javascript" src="<%=path %>/validate/jquery-1.6.2.min.js"></script> <script type="text/javascript" src

    hadoop 学习笔记:mapreduce框架详解

    hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我 学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能是我做技术研究的 思路有关,我开始学习某一套技术总是想着这套技术到底能干什么,只有当我真正理解了这套技术解决了什么问题时候,我后续的学习就能逐步的加快,而学习 hdfs时候我就发现,要理解hadoop框架的意义,hdfs和mapreduce是密不

    【转】jQuery Validate验证框架详解

    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type="text/javascript" src="<%=path %>/validate/jquery-1.6.2.min.js"></script> <script type="text/javascript" src