黑马程序员技术交流社区

标题: 【石家庄校区】Request和Response [打印本页]

作者: 奔跑的蜗牛006    时间: 2018-5-21 15:20
标题: 【石家庄校区】Request和Response
本帖最后由 奔跑的蜗牛006 于 2018-5-21 15:23 编辑

Request和Response

两种方式读取web工程下的文件:
软件里项目工程中的src就变成了D盘(Tomcat)WEB-INF中的classes文件夹
软件里WebContent这个工程名就相当于D盘里工程名;
ServletContext代表整个web项目,它=web-content所以它与WEB-INF同级;
传统方式:
    //创建servlet类
    //FileInputStream路径
    //创建properties对象
    //load()
    //properties.getProperty()
    相对路径不妙
必须在创建的servlet类使用ServletContext对象,普通类不行

ServletContext:
    方法一:inputStream  getResourceAsStream()
    //创建SrevletContext对象
    方法二:context.getrealPath();获得磁盘绝对路径

总结ServletContext功能:四个
读取全局初始化参数:  
    //web.xml(修改添加)
    //<context-param>
    //所有Servlet类都可以获得到
获得文件的MIME类型:
    //String    this.getServletContext.getMimeType("1.html)
作为域对象存储数据:
    //范围:整个web项目,而且全局的对象,都可以获得到;
读取web项目下的文件:

类加载器---读取文件(企业级工具类)
    //在普通class类中,使用类加载器读取文件(前提没有Servlet类)
    //类的加载器用来加载class文件,把class文件加载到内存;
    //InputStream=类名.class.getClassLoader().getRresourceAsStream("db.properties");

文件下载:(Response响应)
​        1.超链接方式:如果浏览器支持的话,就只能打开.不能下载;
​        2.手动编码方式下载(创建Servlet类)

文件下载的核心思想:
        从服务器io读取,写到客户端;
        InputStream in=new FileInputStream("服务器上的路径")
        OutputStream os=response.getOutputStream();
        读:  int len;
             byte[] b=new byte[1024];
            while((len=is.read(b))!=-1){
                os.write(b,0,len);
            }
            is.close();
Response:(API)  
    //HttpServletResponse,ServletResponse   
文件下载步骤:
    //新建Servlet类,设置两个头一个流
    //接收参数
    //设置Content-Type头
    //设置Content-Disposition头
    //设置文件的InputStream.
    //获得response的输出流

中文文件的下载:
    //接收数据
    //设置Content-Type头
    //设置文件的InputStream
    //根据浏览器类型处理中文文件的乱码问题
    //设置Content-Disposition头
    //获得response的输出流

response输出响应内容的方法:
向页面输出的两种方式:
    字节流(不一定乱码,看浏览器)
    response.getOutputStream().writte("hello".getBytes())
    字符流(一定乱码,有缓冲区)
    getWriter().print("中文");
    这两个方法互斥,只能使用其中一个;
    解决字符流中文乱码:response.setContentType("text/html;charset=UTF-8");

用户注册的功能:
页面信息保存到数据库;
Servlet的API:     ServletRequest,
客户端信息(request):
获得请求的方式:    getMethod()
获得请求的路径:    getRequestURL()
获得ip:           getRemoteAddr()
获得工程名:        getContextPath()
获得表单数据:      String getParameter(String name)
(post)          String[] getParameterValues(String name)
                 Map<String,String[]> getParameterMap()
                域对象: setAttribute(String name,String value)
                        getAttribute(String name)
                        removeAttribute()
注册准备工作:
    //创建数据库和表
    //创建包和类(Servelt,Service,Dao)
重写构造(this)方法的时候记得添加无参构造;
表单的提交方式是:post

POST中文乱码:request.setCharacterEncoding("UTF-8");数据库显示防止乱码
GET中文乱码:new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
//接收参数(try,catch)
    request.getParameter("username");
//封装数据
    user.setUsername(username)
//调用业务层处理数据
    userService.regist(user);
//页面跳转
    response.sendRedirect("路径")
处理request接收参数的中文乱码的问题:
    POST和GET提交中文的时候都会出现乱码的问题;
POST解决:request.setCharacterEncoding("UTF-8");在接受参数之前
GET解决:
    参考String的构造方法--
    String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
    分开写:
    String name=requset.getParameter("name");
    String name=new String(name.getBytes("ISO--8859-1"),"UTF-8");

Request作为域对象存取数据:
使用request对象存储数据:
    setAttribute(String name, String value);
    Object getAttribute(String name);
request的作用范围:
    作用范围就是一次请求的范围
    创建:客户端向服务器发送了一次请求以后,服务器会创建一个request的对象.
    销毁:当服务器对这次请求作出了响应之后.

重定向和转发的区别:(redirect和forward区别)重定向:
地址栏发生变化(重新发起第二次请求),两次请求,两次响应;路径带工程名;可以跳转任意网址;存的数据在第一次请求销毁后结束;
response.sendRedirect("/day10/")response.sendRedirect("带工程名称的路径")
转发:
地址栏没变化,一次请求,一次响应;路径不需要带工程名;只能在工程内跳转;request域中存的数据能转到另一个类(页面);
request.getRequestDispatcher("不带工程名的路径").forward(request,response)







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