Struts中Servlet的API类的访问方式

上篇内容的简单回顾

1、什么是Struts2?
Struts2是一个基于MVC设计模式的web层的框架。


2、常见的web层框架有哪些?
Struts2
Struts1
SpringMVC
Webwork


3、Web层框架
基于前端控制器模型。


4、Struts2的入门程序

下载Struts2的开发包
解压Struts2开发环境

创建web项目,引入jar包
即struts/apps/struts-blank.war/WEB-INF/lib/*.jar

编写JSP页面
编写Action类
配置Action类
配置核心过滤器


5、Struts2的执行流程

请求 --> 核心过滤器(StrutsPrepareAndExecuteFilter:预处理执行过滤器) --> 执行一组拦截器(完成部分的功能) --> Action --> Result。


6、Struts2的常见配置

(1)配置文件的加载顺序

后加载的配置文件中的常量值,会覆盖原先配置文件中常量的值。


(2)Action类的配置

package标签

  • name :包名
  • extends :继承,一般就为struts-default
  • namespace :名称空间,与action中name共同决定访问路径
  • abstract :是否让其他包继承

action标签

  • name :与namespace共同决定访问路径
  • class :Action类的全路径
  • method :执行Action中的某个方法,默认值execute

(3)constant常量的配置(default.properties中定义了一大堆常量)

设置Struts2的常量,通常在struts.xml文件中配置


(4)include配置

分模块开发的使用,在struts.xml中引入外部xml配置文件。


7、Struts2的Action的访问

(1)Action的编写

Action编写成POJO类
Action实现Action接口
Action继承ActionSupport类(常用)


(2)Action的访问

通过method属性配置
通过通配符的方式配置(常用)
动态方法访问的方式




Struts2的Servlet的API类的访问

有三种方式:

完全解耦合的方式。
Servlet原生的方式。
接口注入的方式。


1、完全解耦合的方式

JSP代码:

	<h3>方式一:完全解耦合的方式</h3>
	<form action="${ pageContext.request.contextPath }/requestDemo1.action" method="post">
	    账号:<input type="text" name="name" /><br/>
	    密码:<input type="password" name="password" /><br/>
	    <input type="submit" value="登录">
	</form>
	<hr />

Action类:

package com.pipi.struts2.demo1;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Arrays;
import java.util.Map;

// 访问Servlet的API,第一种方式:完全解耦合的方式
public class RequestDemo1 extends ActionSupport {

    @Override
    public String execute() throws Exception {
        // 1、接收参数
        // 获取ActionContext对象
        ActionContext context = ActionContext.getContext();

        // 调用getParameters()方法,获取参数集合
        Map<String, Object> map = context.getParameters();

        // 遍历Map集合,获取key,再得到其value,这里的value是String[]类型
        for (String key : map.keySet()) {
            String[] values = (String[]) map.get(key);
            System.out.println(key + "---" + Arrays.toString(values));
        }

        // 2、往域对象中存入数据,其实是操作域对象的Map集合,并不是域对象本身
        context.put("requestName", "requestValue");  // 存入request域对象的集合中
        context.getSession().put("sessionName", "sessionValue");  // 存入session域对象的集合中
        context.getApplication().put("applicationName", "applicationValue"); // 存入application域对象的集合中

        return SUCCESS;
    }
}

注意:
这种方式只能获得代表request、session、application的数据的Map集合,不能操作这些对象的本身的方法。


2、使用Servlet的API的原生方式(重点,常用的)

JSP代码:

	<h3>方式二:使用Servlet原生的方式</h3>
    <form action="${ pageContext.request.contextPath }/requestDemo2.action" method="post">
        账号:<input type="text" name="name" /><br/>
        密码:<input type="password" name="password" /><br/>
        <input type="submit" value="登录">
    </form>
    <hr />

Action类:

package com.pipi.struts2.demo1;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Map;

// 访问Servlet的API,第二种方式:原生的方式
public class RequestDemo2 extends ActionSupport {

    @Override
    public String execute() throws Exception {
        // 1、接收数据
        // 直接获取request对象
        HttpServletRequest request = ServletActionContext.getRequest();

        // 调用request的获取参数的方法
        Map<String, String[]> map = request.getParameterMap();
        // 遍历map集合
        for (String key : map.keySet()) {
            String[] value = map.get(key);
            System.out.println(key + "---" + Arrays.toString(value));
        }

        // 2、往域对象中存入数据
        // 存入request域对象中
        request.setAttribute("requestName", "requestValue");
        // 获取session对象,再往其中存入数据
        request.getSession().setAttribute("sessionName", "sessionValue");
        // 获取application对象,再往其中存入数据
        ServletActionContext.getServletContext().setAttribute("applicationName", "applicationValue");

        return SUCCESS;
    }
}

注意:
这种方式是常用的。
可以操作域对象的数据,同时也可以获得对象的方法。


3、接口注入的方式

JSP代码:

	<h3>方式三:使用接口注入的方式</h3>
    <form action="${ pageContext.request.contextPath }/requestDemo3.action" method="post">
        账号:<input type="text" name="name" /><br/>
        密码:<input type="password" name="password" /><br/>
        <input type="submit" value="登录">
    </form>
    <hr />

Action类:

package com.pipi.struts2.demo1;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Map;

// 访问Servlet的API,第三种方式:接口注入的方式。实现ServletRequestAware, ServletContextAware接口
public class RequestDemo3 extends ActionSupport implements ServletRequestAware, ServletContextAware {

    private HttpServletRequest request;
    private ServletContext servletContext;

    @Override
    public String execute() throws Exception {
        // 1、接收数据
        // 使用接口注入的方式获得request对象
        Map<String, String[]> map = request.getParameterMap();
        // 遍历map集合
        for (String key : map.keySet()) {
            String[] value = map.get(key);
            System.out.println(key + "---" + Arrays.toString(value));
        }

        // 2、往域对象中存数据
        // 往request对象中存
        request.setAttribute("requestName", "requestValue");
        // 往session对象中存
        request.getSession().setAttribute("sessionName", "sessionValue");
        // 往application对象中存
        servletContext.setAttribute("applicationName", "applicationValue");

        return SUCCESS;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }
}

接口注入方式,比较繁琐,一般很少用到。


注意:
Servlet中的Servlet对象是单例的,多个程序访问同一个Servlet只会创建一个Servlet的实例。

而Struts中的Action是多例的,一次请求,创建一个Action的实例。(不会出现线程安全的问题)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值