Struts2的ServletAPI的获取和各种类型的数据获取(三)上

Struts2是web层框架,主要有两个方面的作用:


1 . 获取前端的客户端输入


2 . 响应后端输出


常常使用到 Servlet API 中相应的方法。


通常有以下三种方式获取 request,response,session,application 对象信息。


1 . Action 通过 ActionContext() 类访问Servlet API


2 . Action 通过实现 XxxAware 接口直接访问 Servlet API


3 . 使用 ServletActionContext 直接访问 Servlet API


所有的Struts2 文章,都已经在web.xml 中添加了StrutsPrepareAndExecuteFilter 过滤器


<!-- 配置struts2的过滤器 -->
<filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>


一. 获取Servlet API 对象


一.一 通过 ActionContext() 类访问 Servlet API


一.一.一 ActionContext 类的主要方法


Struts2的ServletAPI的获取和各种类型的数据获取(三)上


一.一.二 写Demo验证一下


一.一.二.一 编写Action 类 ActionContextDemo


    public class ActionContextDemo extends ActionSupport{
    private static final long serialVersionUID = 1L;
    // 前端传入一个参数 为 name 
    private String name;
    
    /*
     * 通过此方法,展示一下,将数据放置到 request域,session域,application域的用法。
     * */
    public String showData(){
        
        ActionContext actionContext=ActionContext.getContext();
        
        //获取 application 作用域
        Map<String, Object> applicationData=actionContext.getApplication();
        
        //获取application的值
        Integer count=(Integer)applicationData.get("count");
        if(count==null){    
            count=1;
        }else{
            count=count+1;
        }
        //设置application的值
        applicationData.put("count", count);
        
        //获取session 作用域
        
        Map<String,Object> sessionData=actionContext.getSession();
        
        //放置到session域 
        sessionData.put("loginName",name);
        if("两个蝴蝶飞".equals(sessionData.get("loginName"))){
            
            //放置到request域
            actionContext.put("msg","第一种方式 :欢迎您,"+sessionData.get("loginName"));
            //返回success 
            return SUCCESS;
        }
        //放置到request域
        actionContext.put("msg","服务器提示:登录失败");
        return ERROR;
        
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


一.一.二.二 配置 struts.xml 文件


    <package name="hello" extends="struts-default" namespace="/">
        
        <!-- 配置第一种方式 -->
        <action name="actionContextDemo" class="com.yjl.web.action.ActionContextDemo"
        method="showData">
            <result name="success">/WEB-INF/content/success1.jsp</result>
            <result name="error">/WEB-INF/content/error.jsp</result>
        </action>
    </package> 


一.一.二.三 编写前端文件


success1.jsp 里面的内容为:


<body>
    本站访问次数:${applicationScope.count} <br/>
    ${sessionScope.loginName},您已经成功登录<br/>
    ${requestScope.msg}<br/>
</body>


error.jsp 里面的内容为:

Struts2的ServletAPI的获取和各种类型的数据获取(三)上

<body>
    ${requestScope.msg}<br/>
</body>


一.一.二.四 重启服务器,进行验证


当输入网址为: http://localhost:8080/Struts_API/actionContextDemo 时,没有name值,提示登录失败


Struts2的ServletAPI的获取和各种类型的数据获取(三)上


当输入网址为: http://localhost:8080/Struts_API/actionContextDemo?name=两个蝴蝶飞,name正确,提示登录成功


Struts2的ServletAPI的获取和各种类型的数据获取(三)上


当输入网址为: http://localhost:8080/Struts_API/actionContextDemo?name=老蝴蝶,name值错误,提示登录失败


Struts2的ServletAPI的获取和各种类型的数据获取(三)上


可以正常的传输数据。


这种方式,只能往request,session和applicaiton中进行存数据,取数据,只能对数据进行维护,不能像真正的request,response对象提供的那些方法一样强大。 如获取客户端ip,添加cookie 等, 用这种方法就无法实现了。


一.二 通过实现XxxAware 接口实现Servlet API 对象


Struts2针对Servlet 的API 对象,提供了三种接口, HttpServletRequestAware 接口,HttpServletResponseAware接口, ServletContextAware 接口。 其中,session对象可以通过request对象进行获取,所以就没有提供关于session的接口。


一.二.一 XxxAware 接口提供的方法


ServletRequestAware 接口提供了一个 setServletRequest() 方法,用于获取request对象


public abstract interface ServletRequestAware
{
  public abstract void setServletRequest(HttpServletRequest paramHttpServletRequest);
}


ServletResponseAware 接口提供了一个 setServletResponse() 方法,用于获取response对象


public abstract interface ServletResponseAware
{
  public abstract void setServletResponse(HttpServletResponse paramHttpServletResponse);
}


ServletContextAware 接口提供了一个 setServletContext()方法,用于获取application对象


public abstract interface ServletContextAware
{
  public abstract void setServletContext(ServletContext paramServletContext);
}


一.二.二 写Demo验证一下


一.二.二.一 编写Action 类 AwareDemo


    public class AwareDemo extends ActionSupport 
implements ServletRequestAware,ServletResponseAware,ServletContextAware{
    private static final long serialVersionUID = 1L;
    
    private String name;
    
    //接收 application
    private ServletContext application;
    //接收request
    private HttpServletRequest request;
    //接收response
    private HttpServletResponse response;
    //session可以通过 request 进行获取
    private HttpSession session;
    
    @Override
    public void setServletContext(ServletContext application) {
        this.application=application;
    }

    @Override
    public void setServletResponse(HttpServletResponse response) {
        this.response=response;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request=request;
        this.session=request.getSession();
    }
    
    public String showData(){

        //获取application的值
        Integer count=(Integer)application.getAttribute("count"); 
        if(count==null){    
            count=1;
        }else{
            count=count+1;
        }
        //设置application的值
        application.setAttribute("count",count);
        
        
        //放置到session域 
        session.setAttribute("loginName",name);
        if("两个蝴蝶飞".equals(session.getAttribute("loginName"))){
            
            //放置到request域
            request.setAttribute("msg","第二种方式:欢迎您,"+session.getAttribute("loginName"));
            //展示ip 地址
            request.setAttribute("ip",request.getLocalAddr());
            
            //通过response 对象,设置cookie 
            
            Cookie cookie=null;
            try {
                cookie = new Cookie("userName",
                        URLEncoder.encode(session.getAttribute("loginName").toString(),"UTF-8"));
            } catch (UnsupportedEncodingException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            cookie.setMaxAge(60*60);
            cookie.setPath("/");
            response.addCookie(cookie);
            
            //返回success 
            return SUCCESS;
        }
        //放置到request域
        request.setAttribute("msg","服务器提示:登录失败");
        return ERROR;
    }
    
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}


里面多提供了 request获取客户端ip和 response添加 cookie的操作


一.二.二.二 配置struts.xml 文件


<!-- 配置第二种方式 -->
<action name="awareDemo" class="com.yjl.web.action.AwareDemo"
method="showData">
    <result name="success">/WEB-INF/content/success2.jsp</result>
    <result name="error">/WEB-INF/content/error.jsp</result>
</action>


一.二.二.三 编写前端界面


success2.jsp, 内容主要是:


<!--引入jquery文件,网络版的 -->
<script src="http://code.jquery.com/jquery-latest.js"></script>

<body>
    本站访问次数:${applicationScope.count} <br/>
    ${sessionScope.loginName},您已经成功登录<br/>
    ${requestScope.msg}<br/>
    ip:${requestScope.ip}<br/>
    cookie值:<span id="cookieValue"></span>
    
    <script>
        $(function(){
            var username = decodeURIComponent("${cookie.userName.value}");//如果为空,使用解码后为空字符串
            if(!username.length==0){
                $("#cookieValue").text(username);
            }
        })
    </script>
</body> 


一.二.二.四 重启服务器,进行验证


输入网址: http://localhost:8080/Struts_API/awareDemo?name=两个蝴蝶飞


Struts2的ServletAPI的获取和各种类型的数据获取(三)上


ip地址和cookie 均可以正常获取。


用js 脚本,解决了 cookie 中文乱码的问题。


这种方式,还需要实现接口,重写里面的方法,如果需要同时获取request,response,application对象,那么需要实现三个接口,太复杂。



上一篇:《Python机器学习——预测分析核心算法》——1.5 构建预测模型的流程


下一篇:袋鼠云助力福州市行政(市民)服务中心建设数据可视化大屏展映第二届数字中国建设峰会