美文网首页
4. Java Web Servlet开发中涉及的对象

4. Java Web Servlet开发中涉及的对象

作者: 飞扬code | 来源:发表于2019-07-09 19:29 被阅读0次

Servlet开发中涉及的对象:

HttpservletRequest对象: 封装请求信息
HttpServletResponse对象: 封装响应信息
ServletConfig对象: 封装一个servlet配置参数信息
ServletContext对象: servlet的上下文对象

ServletConfig对象

servletconfig是配置对象,主要把servlet的初始化参数封装到这个对象中。一个网站中可能会存在多个ServletConfig对象,一个ServletConfig对象就封装了一个servlet的配置信息。

配置初始化参数

<servlet>
    <servlet-name>ConfigDemo</servlet-name>
    <servlet-class>com.demo.f_config.ConfigDemo</servlet-class>
    <!-- servlet的初始化参数 -->
    <init-param>
        <param-name>path</param-name>
        <param-value>e:/aaa.txt</param-value>
    </init-param>
  </servlet>

在servlet中获取初始化参数
config.getInitParameter("name"); 根据参数名称获取参数值
config.getInitParameterNames(); 获取所有参数名称


ServletContext对象

ServletConfig对象叫servlet上下文对象。 一个网站只会创建一个ServletContext对象。代表的是整个网站的环境信息。
获取ServletContext对象

this.getServletConfig().getServletContext();  

通过ServletConfig对象来获取到ServletContext对象的。

ServletContext对象:启动的时候创建。
ServletConfig对象:调用init方法之前创建的,在ServletContext对象创建之前。

public ServletCofig{
         ServletContext context;
         public ServletConfig(context){
                this.context=context;
         }
         public ServetContxt getServletContext(){
              return;
         }
}

ServletConfig config = new ServletConfig(context);

public MyServlet extends HttpSevlet{
 
       publlic init(ServletConfig config){
                SevletContext context= config. getServletContext();
    }
}

ServletContext的5大作用

1)获取web的上下文路径

java.lang.String getContextPath()

/**
* 【context对象的作用1】-获取web上下文路径
* @author APPle
*
*/
public class ContextDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        /**
         * 获取web上下路径
         */
        //1.1.获取ServletContext对象
        //ServletContext context = this.getServletConfig().getServletContext();
        /**
         * 推荐使用简写
         */
        ServletContext context = this.getServletContext();
        
        //1.2 获取
        String path = context.getContextPath();
        System.out.println(path); // /demo
        /**
         * web上下文路径就是项目在tomcat服务器中运行的路径。注意不是开发目录的项目名称。
         */
        //请求重定向
        //response.sendRedirect("/demo/hello.html");
        
        //作用:可以让这个获取文件的路径更加灵活
        response.sendRedirect(context.getContextPath()+"/hello.html");
    }

}

2)获取全局参数

java.lang.String getInitParameter(java.lang.String name)
java.util.Enumeration getInitParameterNames()

 <web-app version="2.5" 
    xmlns="[http://java.sun.com/xml/ns/javaee](http://java.sun.com/xml/ns/javaee)"
    xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)" 
    xsi:schemaLocation="[http://java.sun.com/xml/ns/javaee](http://java.sun.com/xml/ns/javaee)
    [http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd](http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd)">

    <!-- 配置web应用全局的参数 -->
    <context-param>
       <param-name>AAA</param-name>
       <param-value>AAA's value</param-value>
    </context-param>

    <context-param>
       <param-name>BBB</param-name>
       <param-value>BBB's value</param-value>
    </context-param>

    <context-param>
       <param-name>CCC</param-name>
       <param-value>CCC's value</param-value>
    </context-param>

全局参数对当前web应用下的所有servlet都有效的。

/**
* 【context对象作用2】-获取全局参数
* @author APPle
*
*/
public class ContextDemo2 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 得到全局参数
         */
        ServletContext context =
                this.getServletContext();
        System.out.println(context.getInitParameter("AAA"));
        
        //遍历所有参数
        Enumeration<String> enums = context.getInitParameterNames();
        while(enums.hasMoreElements()){
            String paramName = enums.nextElement();
            String paramValue = context.getInitParameter(paramName);
            System.out.println(paramName+"="+paramValue);
        }         
    }
}


3)和域对象相关的

void setAttribute(java.lang.String name, java.lang.Object object) 保存数据
java.lang.Object getAttribute(java.lang.String name) 得到数据
void removeAttribute(java.lang.String name)清除数据

什么是域对象?
域对象在不同的资源之间来共享数据。保存数据,获取数据。
域对象的作用: 主要用于保存数据和获取数据,用于在web应用中不同资源之间共享数据。


image.png

例如:
Servlet1
name=eric
response.sendRedirect("/Servlet2?name=eric");

Servlet2
request.getParameter("name");
1)参数形式: 只能传递字符串数据
2)使用域对象形式:
在Servlet1中保存数据
在Servlet2中获取数据

public class ScopeDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 把数据存储到ServletContext域对象
         */
        ServletContext context =
                    this.getServletContext();
        //context.setAttribute("name", "eric");
        List list = new ArrayList();
        list.add("eric");
        list.add("jacky");
        list.add("rose");
        context.setAttribute("list", list);
        System.out.println("保存成功");
    }

}


public class ScopeDemo2 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 从ServletContext域对象中取出数据
         */
        ServletContext context =
                this.getServletContext();
        //String name = (String)context.getAttribute("name");
        List list = (List)context.getAttribute("list");
        
        System.out.println(list);
    }
}

ServletContext就是我们学习的第一个域对象。
ServletContext域作用范围:在当前的web应用中有效。

Servlet中所有域对象:
HttpServletRequest对象: request域
ServletContext对象: context域
HttpSession对象: session域

Jsp中域对象:
PageContext对象: page域


4)转发相关的

RequestDispatcher getRequestDispatcher(java.lang.String path)


image.png

在servlet中实现页面跳转
请求重定向: response.sendRedirect(路径);
请求转发: request.getRequestDispacher(路径).forward(request,respone);

public class RedirectDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 请求重定向(浏览器行为)
         */
        //response.sendRedirect("/demo/hello.html");
        
        /**
         * 注意:
         *         可以跳转到当前项目的资源,也可以跳转到其他项目的资源
         */
        //response.sendRedirect("/demo/adv.html");
        
        /**
         * 把数据保存到request域对象
         */
        request.setAttribute("name", "jacky");        
        response.sendRedirect("/demo/GetDataServlet");       
    }
}
public class GetDataServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {       
        /**
         * 从request域对象中取出数据
         */
        String name = (String)request.getAttribute("name");
        System.out.println("name="+name);        
    }
}
/**
* 【context对象作用4】--请求转发
* @author APPle
*
*/
public class ForwardDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 转发:服务器行为
         */
        /*
        ServletContext context = this.getServletContext();
        RequestDispatcher rd = context.getRequestDispatcher("/hello.html");
        rd.forward(request, response);
        */
        /**
         * 注意:转发只能转发都当前项目的资源
         */
        //this.getServletContext().getRequestDispatcher("../Demo/adv.html")
            //    .forward(request, response);
        
        /**
         * 把数据保存到request域对象
         */
        request.setAttribute("name", "jacky");
            
        //this.getServletContext().getRequestDispatcher("/GetDataServlet")
            //    .forward(request, response);
        
        /**
         * 简写方式
         */
        request.getRequestDispatcher("/GetDateServlet").forward(request, response);
    }
}
求重定向 vs 请求转发 区别

请求重定向:
1)地址栏改变,改变为重定向到地址
2)可以重定向到当前web应用,其他web应用,甚至是其他站点资源。
3)处于两次不同的请求。不可以使用request域对象来共享数据。

请求转发:
1)地址栏不会改变。
2)只能转发到当前web应用内部资源。
3)处于同一次请求。可以使用request域对象来共享数据


5)读取web项目的资源文件

java.lang.String getRealPath(java.lang.String path) 得到资源文件的绝对路径
java.io.InputStream getResourceAsStream(java.lang.String path)
java.net.URL getResource(java.lang.String path)
注意:
1)在java项目中ecplise工具,把java命令的运行根目录设置到项目根目录下。
2)在web项目中. 表示从tomcat的bin开始,因为java命令从bin目录开始执行。

相关文章

网友评论

      本文标题:4. Java Web Servlet开发中涉及的对象

      本文链接:https://www.haomeiwen.com/subject/otmfkctx.html