黑马程序员技术交流社区

标题: ServletContext,response,request [打印本页]

作者: LLLXXX    时间: 2018-4-6 23:34
标题: ServletContext,response,request

ServletContext:
创建:服务器启动的时候,tomcat服务器为每个web项目创建一个单独ServletContext对象.          
            销毁:服务器关闭的时候,或者项目从服务器中移除的时候.
        如何获得:this.getServeltContext()

        功能一:作为域对象存取数据:
                范围:整个web应用的范围
                创建:服务器启动的时候,服务器为每个web项目创建一个单独的ServletContext对象.
                销毁:服务器关闭的时候销毁ServletContext.
                存取数据的方法:
                        setAttribute(String name,Object value);用来向ServletContext中存入数据.
                        Object getAttribute(String name);         用来向ServletContext中存入数据.
注意:取出的数据是Object类型,所以要得到想要的类型,需要强制转换

        功能二:读取web项目下的文件:
                InputStream getResourceAsStream(String path);根据提供路径读取文件返回一个文件的输入流.
InputStream is = context.getResourceAsStream("/WEB-INF/classes/db.properties");
                String getRealPath(String path);返回一个路径的磁盘绝对路径.
String realPath = context.getRealPath("/WEB-INF/classes/db.properties");


        类加载器读取文件:
                获得类加载器:类名.class.getClassLoader()   
                读取文件的方法:  
                InputStream 类名.class.getClassLoader().getResourceAsStream(String path);
        InputStream is=a.class.getClassLoader().getResourceAsStream("db.properties");

功能三:读取全局初始化参数:
       String password = this.getServletContext().getInitParameter("password");
Enumeration<String> e = this.getServletContext().getInitParameterNames();
while(e.hasMoreElements()){
String name = e.nextElement();
String value = this.getServletContext().getInitParameter(name);
System.out.println(name+"    "+value);
}

功能四:获得文件的MIME的类型(用于文件下载)
String  getMimeType(String file)

response:
        文件下载:response.getOutputStream()
       
        response.setContentType("text/html;charset=utf-8")
        response.getWriter().print()      -----以后不怎么常用

1.response.setStatus()//设置状态码
2.response.setHeader()//设置响应头
3.response.getOutputStream();//获取字节流 主要使用于下载文件获得response的输出流         OutputStream os = response.getOutputStream();
4.resposne.getWriter();//获取字符流

这两个方法是互斥的.做出响应的时候只能使用其中的一种流响应.

输出中文乱码的处理:
    * 字节流:
        * 设置浏览器默认打开的编码:
            * resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
        * 设置中文字节取出的时候编码.
            * “中文”.getBytes(“UTF-8”);


    * 字符流:
        * 设置浏览器打开的时候的编码
            * resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
        * 设置response的缓冲区的编码
            * response.setCharacterEncoding(“UTF-8”);

        ***** 简化的写法:response.setContentType(“text/html;charset=UTF-8”);

request:
作用范围:
作用范围就是一次请求的范围.
创建和销毁:
     创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象.
     销毁:当服务器对这次请求作出了响应之后.

功能一:获得客户端的信息:
                获得请求方式:String  getMethod();
                获得ip地址:     String  getRemoteAddr();
                获得工程名 :      String  getContextPath();

功能二:接受参数:
                String    getParameter(String name) 用于接收一个名称对应一个值的数据,得到字符串类型的数据
                String [] getParameterValues(String name)用于接收一个名称对应多个值的数据.得到一个字符串数组
                Map<String,String[]> getParameterMap();用于接收表单中的所有的数据,Map的key是表单提交的参数名,得到一个map<String,String []>类型的map,称,Map的value是提交参数的值.
               
请求的乱码问题:
        get:
                String aa = new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8")

        post:
POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中.request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.
        设置request的缓冲区的编码:
        request.setCharacterEncoding("UTF-8") 一定要在接收第一个参数之前设置编码就OK.


功能三:作为域对象存取数据:
                范围:一次请求响应的范围
                存取数据的方法:
                        setAttribute(String name,Object value);
                        Object getAttribute(String name);

1.String method=request.getMethod()//获取请求方式get,post....
2.String requestURI = request.getRequestURI();//得到的不包含域名和项目名
3.String requestUIL= request.getRequestURL()://得到的是完整的连接http:/…….
3.String remoteAddr= request.getRemoteAddr()//获取客户机地址
4.String contextPath = request.getContextPath();//获取项目名
5.getAttribute();//存数据
6.setAttribute();//取数据
7.removeAttribute();

转发和重定向的区别:
        转发:request.getRequestDispatcher("不带工程名的地址").forward(request,response);
        重定向:response.sendRedirect("带工程名的地址")  这个地方注意:工程名应该动态的获取
        区别:
                地址栏:重定向变化转发不变
                请求响应的次数:重定向是两次请求两次响应,转发是一次请求和一次响应 (如果放入request域中的数据转发能够取出,重定向取不出)
  所以转发使用request域
                路径的写法:重定向带工程名 转发不带
                跳转发范围:重定向可以跳转任意地址,转发只能在同一工程下跳转

作者: tom19970323    时间: 2018-4-7 12:11


作者: 小皖妹妹    时间: 2018-5-27 20:38
你自己记住了吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2