• Struts2基础学习(二)—Action


    一、ActionSupport

         为了让用户开发的Action类更加规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范。下面是标准Action接口的代码:

    public interface Action {
    
        public static final String SUCCESS = "success";
    
        public static final String NONE = "none";
    
        public static final String ERROR = "error";
    
        public static final String INPUT = "input";
    
        public static final String LOGIN = "login";
    
    
        public String execute() throws Exception;
    
    }

         上面的Action接口里只定义了一个execute()方法,该接口规范规定了Action类应该包含一个execute()方法,该方法返回一个字符串,此外,该接口还定义了5个字符串常量,他的作用是统一execute()方法的返回值。

         Struts2还为Action接口提供了一个实现类:ActionSupport。

         image

         image

         ActionSupport是一个默认的Action实现类,该类里已经提供了许多默认方法,这些方法包括表单域校验、错误信息设置和获取国际化信息一些方法,实际上,ActionSupport是Struts2的默认的Action处理类,如果让开发者的Action类继承该 ActionSupport类,则会大大简化Action的开发。

    二、使用通配符配置Action

    (1)在配置<action>元素时,允许在指定name属性时,使用模式字符串(用"*"代表一个或多个任意字符) 。

    (2)在class、method属性及<result>子元素中通过 {N} 形式代表前面地N个* 匹配子串。

         image

         image

         *_*代表匹配两个字符串。

         {1} 匹配UserAction 用于执行class 。

         {2} 匹配login用于指定method执行方法和结果页面。

    包声明

         image

    可以改写为:

         image

    三、动态方法的调用

    (1)通过url动态指定调用Action哪个方法而无需配置<action>的method属性 。

    (2)通过 !方法名 指定调用Action哪个方法。

    		<action name="cus" class="com.kiwi.action.CusAction">
    			<result name="success">/success.jsp</result>
    		</action>

    访问路径:

               image

         struts2默认是不能通过这种方式来访问的,必须配置一个常量。

    	<!-- 允许动态访问 -->
    	<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

    四、默认的Action

         如果用户输入一个不存在的action,默认会报错,我们可以配置一个默认的action。

    		<!-- 用户访问的Action如果不存在,就会访问此默认的Action -->
    		<default-action-ref name="defaultAction"></default-action-ref>
    		<action name="defaultAction">
    			<result>/success.jsp</result>
    		</action>	
    例如:

         image

    五、访问Web资源

         在Action中,如果想访问HttpSession、HttpServletRequest、HttpServletResponse等Servlet原生API我们可以通过如下两种方式。

         (1)与Servlet API解耦的方式访问

             A: 通过ActionContext

             B: 实现ApplicationAware、SessionAware、RequestAware接口

         (2)与Servlet API耦合的方式访问

             A: 通过ServletActionContext

             B: 实现ServletApplicationAware、ServletSessionAware、ServletRequestAware接口

    1.与Servlet API解耦的访问方式

         为了避免与Servlet API耦合在一起, 方便Action做单元测试, Struts2对HttpServletRequest, HttpSession 和ServletContext 进行了封装, 构造了3个Map 对象来替代这3个对象, 在Action中可以直接使用3个对象对应的Map对象来保存和读取数据。

    (1)通过ActionContext访问Web资源

         ActionContext是Action执行的上下文对象, 在ActionContext中保存了Action执行所需要的所有对象, 包括parameters, request, session, application 等。

    public Map getSession(): 获取HttpSession对应的Map。

    public Map getApplication(): 获取ServletContext对应的Map 。

    public Map getParameters(): 获取对象获取请求参数对应的Map。

    public Object get(Object key): ActionContext类中没有提供类似getRequest()这样的方法来获取Request对应的Map 对象. 要得到HttpServletRequest对应的Map对象, 可以通过为get()方法传递"request"参数实现。

    index.jsp

    <a href="${pageContext.request.contextPath}/testServlet.action?name=Tom">Struts2入门</a>

    struts.xml

    		<action name="testServlet" class="com.kiwi.action.ServletTestAction">
    			<result name="success" >/result.jsp</result>
    		</action>

    result.jsp

      <body>
        
        application: ${applicationScope.applicationKey}<br> 
        session: ${sessionScope.sessionKey}<br> 
        request: ${requestScope.requestKey}<br> 
        name: ${parameters.name[0]}<br> 
        
      </body>

    ServletTestAction.java

    public class ServletTestAction extends ActionSupport{
    
    	@Override
    	public String execute() throws Exception{
    		
    		//1.获取ActionContext对象,是Action的上下文对象
    		ActionContext actionContext = ActionContext.getContext();
    		
    		//2.获取application对应map,并添加一个属性
    		Map<String,Object> applicationMap = actionContext.getApplication();
    		applicationMap.put("applicationKey","这是application的值");
    		
    		//3.获取session对应map,并添加一个属性
    		Map<String,Object> sessionMap = actionContext.getSession();
    		sessionMap.put("sessionKey","这是session的值");
    		
    		/*
    		 * 4.获取request对应map,并添加一个属性
    		 * 注意:
    		 *     ActionContext中没有提供getRequest()方法来获取request对应的Map
    		 *     需要调用get()方法并传入"request"字符来获取
    		 */
    		Map<String,Object> requestnMap = (Map<String,Object>)actionContext.get("request");
    		requestnMap.put("requestKey","这是request的值");
    		
    		/*
    		 * 5.获取请求参数对应map,并获取指定的参数值
    		 * 注意:
    		 *    1.键:请求参数的名字       值:请求参数对应的字符串的数组
    		 *    2.paramters这个Map只能读不能写
    		 */ 
    		Map<String,Object> parametersMap = actionContext.getParameters();
    		String[] names = (String[])parametersMap.get("name");
    		System.out.println("name: " + names[0]); //Tom
    		
    		return SUCCESS;
    	}
    }

    结果:

         image

    (2)通过实现Aware访问Web资源
        Action 类通过可以实现某些特定的接口, 让Struts2框架在运行时向Action实例注入parameters, request, session 和 application对应的Map对象。

    public class ServletTest2Action extends ActionSupport implements ApplicationAware,SessionAware,RequestAware,
    		ParameterAware{
    
    	private Map<String,Object> application;
    	private Map<String,Object> session;
    	private Map<String,Object> request;
    	private Map<String,String[]> parameters;
    	
    	@Override
    	public String execute() throws Exception{
    
    		//1.向application加入一个属性
    		application.put("applicationKey","application值---接口实现");
    		
    		//2.向session加入一个属性
    		session.put("sessionKey","session值---接口实现");
    		
    		//3.向request加入一个属性
    		request.put("requestKey","request值---接口实现");
    		
    		//4.从parameters读取指定的值
    		String[] names = parameters.get("name");
    		System.out.println(names[0]); //Tom
    		
    		return SUCCESS;
    	}
    
    	@Override
    	public void setApplication(Map<String,Object> application){
    		this.application = application;
    	}
    	
    	@Override
    	public void setSession(Map<String,Object> session){
    		this.session = session;
    	}
    	
    	@Override
    	public void setRequest(Map<String,Object> request){
    		this.request = request;
    	}
    	
    	@Override
    	public void setParameters(Map<String,String[]> parameters){
    		this.parameters = parameters;
    	}
    	
    }

    结果:

          image

         建议: 若一个Action类中有多个Action方法,且多个方法都需要使用域对象的Map或parameters,则建议使用实现接口的方法。

    2.与Servlet耦合的方式访问Web资源

    (1)通过ServletActionContext访问Web资源

    getSession(): 直接获取HttpSession对象。

    getRequest(): 直接获取HttpServletRequest对象 。

    getServletContext(): 直接获取HttpServletContext对象

    (2)通过实现Aware访问Web资源

         实现ServletRequestAware, ServletContextAware 接口的方式。

  • 相关阅读:
    接口测试用例设计
    UI测试用例设计,场景测试法
    接口测试
    JsonSchema和JsonSchemaValidator
    接口测试指导方案 转:紫漪
    appium实例1:启动淘宝app
    性能测试入门
    性能测试结果分析
    Django解决 'ascii' codec can't encode characters in position
    如何解决 Django中出现的 [Errno 13] Permission denied问题
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5470780.html
Copyright © 2020-2023  润新知