Struts2 Part1

原作者:尚硅谷-佟刚


基本配置:

<?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>
  <!-- 
    package:包,struts2使用package 来组织模块
    name:用于其他包应用当前的包
    extends:所继承的包(包括:所有配置)
    namespace:默认值 "/"  非默认     值:http://localhost:8080/contextPath/namespace/actionName.ac  tion
   -->
<package name="helloworld" namespace="/atguigu" extends="struts-default">
     <!-- 配置一个action: 一个struts2的请求就是一个action
          name:对应一个struts2的请求的名字,不包含"/"和扩展名

            默认:class:com.opensymphony.xwork2.ActionSupport
             method:execute
            默认:result:结果
            name:success 
            type:dispatcher(转发)  
     -->
     <action name="product-input" 
             class="com.opensymphony.xwork2.ActionSupport"
             method="execute">
         <result name="success" type="dispatcher">/WEB-INF/pages/input.jsp</result>
     </action>

  </package>

</struts>

与Servlet API解耦的访问方式


package com.atguigu.struts2.action;

import java.util.Map;

import org.apache.struts2.dispatcher.SessionMap;

import com.opensymphony.xwork2.ActionContext;

public class TestActionContextAction {

    public String execute(){
        //获取ActionContext对象
        //ActionContext是Action的上下文,可以从中获取到当前Action需要的一切信息

        ActionContext actionContext = ActionContext.getContext();


        //1.获取application对应的Map ,并向其中添加一个属性
        Map<String, Object> applicationMap = actionContext.getApplication();
        //设置属性
        applicationMap.put("applicationKey","applicationValue");
        //获取属性
        Object date = applicationMap.get("date");
        System.out.println("date:"+date);

        //2.session
        Map<String, Object> sessionMap = actionContext.getSession();
        sessionMap.put("sessionKey","sessionValue");
        System.out.println(sessionMap.getClass());

        if(sessionMap instanceof SessionMap){
            SessionMap<String,Object> sm=(SessionMap) sessionMap;
            sm.invalidate();
            System.out.println("session失效了....");
        }

        //3.request
        //ActionContext中并没有提供getRequest方法来获取request对应的Map
        //需要手工调用get()方法,传入request字符串来获取
        Map<String,Object> requestMap=(Map<String, Object>) actionContext.get("request");
        requestMap.put("requestKey","requestValue");

        //4.获取请求参数对应的Map,并获取指定的参数值
        //键:请求参数的名字,值:请求参数的值对应的字符串数组
        //注意:1.getParameters()返回值为Map<String,Object> 而不是 Map<String,String[]>
        //    2.parameters这个Map只能读,不能写入数据,如果写入,但不出错,但也不起作用! 
        Map<String,Object> parameters = actionContext.getParameters();
        String[] names=(String[]) parameters.get("name");
        System.out.println(names[0]);

        parameters.put("age",100);

        return "success";
    }
}

package com.atguigu.struts2.action;

import java.util.Map;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

public class TestAwareAction implements ApplicationAware,SessionAware,RequestAware,ParameterAware{

    public String execute(){
        //1.向application中加入一个属性:applicationKey2 - applicationValue2
        application.put("applicationKey2","applicationValue2");

        //2.从application中读取属性date,并打印
        System.out.println(application.get("date"));

        //3.session
        session.put("sessionKey2","sessionValue2");

        //4.request
        request.put("requestKey2", "requestValue2");

        String[] vals = parameters.get("name");
        System.out.println(vals[0]);

        parameters.put("age", new String[]{"33"});

        return "success";
    }

    private Map<String,Object> application;
    private Map<String,String[]> parameters;
    private Map<String,Object> request;
    private Map<String,Object> session;

    @Override
    public void setApplication(Map<String, Object> application) {
        this.application=application;
    }

    @Override
    public void setParameters(Map<String, String[]> parameters) {
          this.parameters=parameters;       
    }

    @Override
    public void setRequest(Map<String, Object> request) {
          this.request=request;     
    }

    @Override
    public void setSession(Map<String, Object> session) {
         this.session=session;      
    }


}

与 Servlet 耦合的访问方式


package com.atguigu.struts2.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

public class TestServletActionContextAction {

    /**
     * ServletActionContext:可以从中获取到当前Action对象需要的一切Servlet API相关的对象.
     * 
     * 常用方法:
     * 1. 获取HttpServletRquest:ServletActionContext.getRequest();
     * 2. 获取HttpSession:ServletActionContext.getRequest().getSession()
     * 3. 获取ServletContext:ServletActionContext.getServletContext()
     * 
     */

    @SuppressWarnings("unused")
    public String execute(){

        HttpServletRequest request=ServletActionContext.getRequest();
        HttpSession session=ServletActionContext.getRequest().getSession();
        ServletContext servletContext=ServletActionContext.getServletContext();

        System.out.println("execute....");


        return "success";
    }
}

package com.atguigu.struts2.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;

/**
 *通过实现ServletXxxAware接口的方式可以由Struts2注入
 *需要的Servlet相关的对象
 *  ServletRequestAware:注入HttpSevletRequest对象(比较常用)
 *  SevletContextAware:注入ServletContext对象 (比较常用)
 *  ServletResponseAware:注入HttpServletResponse对象
 */
public class TestServletAwareAction implements ServletRequestAware,ServletContextAware,ServletResponseAware{

    @Override
    public void setServletResponse(HttpServletResponse response) {
        System.out.println(response);
    }

    private ServletContext context;

    @Override
    public void setServletContext(ServletContext context) {
        this.context=context;
        System.out.println(context);
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        System.out.println(request);
    }

    public String execute(){
        System.out.println("ServletContext:" +context);
        return "success";
    }

}

配置结果响应类型


 <!-- 
        result:表示结果的响应类型
       -->
      <action name="testResult" class="com.atguigu.struts2.action.TestResultAction">
            <result name="success" type="dispatcher">/success.jsp</result>
            <result name="login" type="redirect">/login.jsp</result>
            <!-- 重定向到一个Action
             -->
                <result name="index" type="redirectAction">
                   <param name="actionName">testAction</param>
                   <param name="namespace">/atguigu</param>
                </result>
             <!-- 通过redirect 的响应类型也可以便捷的实现redirectAction的功能!
                 <result name="index" type="redirect">/atguigu/testAction.do</result>
              -->

            <!-- 转发到一个Action         
            -->  

                <result name="test" type="chain">
                   <param name="actionName">testAction</param>
                   <param name="namespace">/atguigu</param>
                </result>

            <!-- 不能通过type="dispatcher" 的方式转发到一个Action 
               <result name="test" type="dispatcher">/atguigu/testAction.do</result>
            -->

      </action>

    </package>

    <package name="testPackage" namespace="/atguigu" extends="struts-default">
       <action name="testAction" class="com.atguigu.struts2.action.TestAction">
         <result>/success.jsp</result>
       </action>
    </package>

通配符*的使用(极大地简化了配置文件)


 <action  name="UserAction-*" class="com.atguigu.struts2.action.UserAction"
            method="{1}">
            <result name="{1}-success">/success.jsp</result>
        </action>

代替:

 <action  name="UserAction-save" class="com.atguigu.struts2.action.UserAction"
                      method="save">
                    <result name="save-success">/success.jsp</result>
               </action>

               <action name="UserAction-test" class="com.atguigu.struts2.action.UserAction"
                       method="test">
                    <result name="test-success">/success.jsp</result>
               </action>

               <action  name="UserAction-update" class="com.atguigu.struts2.action.UserAction"
                    method="update">
                    <result name="update-success">/success.jsp</result>
                </action>

                <action  name="UserAction-delete" class="com.atguigu.struts2.action.UserAction"
                    method="delete">
                    <result name="delete-success">/success.jsp</result>
                </action>

                <action  name="UserAction-query" class="com.atguigu.struts2.action.UserAction"
                    method="query">
                    <result name="query-success">/success.jsp</result>
                </action>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值