您的位置:首页 > 编程语言 > Java开发

Day26 JavaWeb知识 (3)_HTTPServletRequest 和 HTTPServletResponse

2019-06-05 20:43 651 查看

一.Servlet配置方式

  1. 全路径匹配
    - - 以 / 开始    例如  :   /a      /aa/bb
    - - localhost:8080/项目名称/aa/bb
  2. 路径匹配 , 前半段匹配
    - - 以 / 开始  ,  但是以 * 结束     例如  :     /a/*    /*
    - - * 其实是一个通配符, 匹配任意文字
    - - localhost:8080/项目名称/aa/bb
  3. 以扩展名匹配
    - - 写法:  没有/   以*开始   *.扩展名         例如 *.aa    *.bb

二.ServletContext

  1. Servlet 上下文
  2. 每个web工程都只有一个ServletContext对象.
  3. 获取对象:
              ServletContext context = new getServletContext();
  4. 作用: 可以获取全局配置参数
    <context-param>
        <param-name>age</param-name>
        <param-value>23</param-value>
    </context-param>
    获取全局参数
    ServletContext context = new getServletContext();
    String age = context.getInitParameter("age");
    syso(age);
  5. 可以获取web应用中的资源
    - - 1.获取资源在tomcat里面的绝对路径
            先得到路径,然后自己new InputSteam
       ServletContext context = new getServletContext();  //获取ServletContext对象
       Properties properties = new Properties();                 //创建属性对象
       String path = context.getRealPath("file/config.properties");
       Inputstream is = new FileInputStream(path);
       properties.load(is);                
    - - 2.getResourceAsStream 资源获取 流对象
       ServletContext context = new getServletContext();
       Properties properties = new Properties();
       Inputstream is = context.getResourceAsStream("file/config.properties");
       properties.load(is);
     - - 3.根据classloader去获取工程下的资源   类加载器
       ServletContext context = new getServletContext();
       Properties properties = new Properties();
       Inputstream is = this.getClass().getClassLoader().getResourceAsStream("../../file/config.properties"); 
       //因为类加载的路径是          ....\项目名\WEB-INF\classes           需要向上返回两级目录
       //而需要读取的文件路径是   ....\项目名\file\config.properties
       properties.load(is);
  6. 存储数据,   servlet间共享数据    域对象
    - - 1.使用ServletContext存储数据
       定义一个登陆的html页面,定义一个form表单
                <form action="LoginServlet" method="get">       //这里的action写的是相对路径,是根据web.xml中的url-pattern
                          账号密码省略不写   
                </form>
       定义一个Servlet,名为LoginServlet
              重写doGet方法
             //1.获取数据 String userName = request.getParameter("username");
             //2.校验数据  PrintWriter pw = response.getWriter();   //向客户端输出内容
       针对成功或者失败,进行判断,然后跳转到不一样的网页
                if(条件判断){
                      //设置状态码? 重新定位  状态码
                      reponse.setStatus(302);
                      //定位跳转的位置是哪一个页面
                      response.setHeader("Location","login_success.html");
                }else{
                       pw.write("login failed..");
                }
  • ServletContext 何时创建,何时销毁
    服务器启动的时候,会为托管的每个web应用程序,创建一个ServletContext对象
    从服务器移除托管,或者是关闭服务器
  • 三.HttpServletRequest

    这个对象封装了客户端提交过来的一切数据

    1. 可以获取客户端请求头信息
           Enumeration<String> headerNames = request.getHeaderNames();
    2. 获取客户端提交过来的数据
       - -
           String name = request.getParameter("name");
           String address = request.getParameter("address");
       - -
           Map<String,String[ ]> map = request.getParameterMap();  //对应的请求是这种类型的: name=xxx&name=zzz&name=ccc
           可以使用map.keySet(); 然后用迭代器遍历/增强for循环遍历
    3. 获取中文问题
      - - 客户端提交数据给服务器端,如果数据中带有中文的话,有可能会出现乱码情况 如果是Get方式
      String username = request.getParameter("username");
      //get请求过来的数据,在url地址栏上就已经经过编码了,所以我们取到的是乱码
      //tomcat收到了这批数据,getParameter默认使用ISO-8859-1去解码
      //先让文字回到ISO-8859-1对应的字节数组,然后再按utf-8组拼字符串
      username = new String(username.getBytes("ISO-8859-1"), "UTF-8");

      简单的方法:直接在tomcat里面配置,以后get请求过来的数据永远都是UTF-8编码
      在tomcat的conf/server.xml 中 找到port="8080"的Connector,加上URIEncoding="UTF-8"
    4. 如果是Post方式
      在doGet()方法的第一行写上:
         //设置请求体里面的文字编码
      request.setCharacterEncoding("UTF-8");

    四.HttpResponse

    负责返回数据给客户端
    - - 输出数据到页面上
                   //以字符流的方式写数据
                     response.getWriter().writer("<h1>hello response...</h1>");
                   //以字节流的方式写数据
                      response.getOutputStream().write("hello response....".getBytes());
    - - 输出中文乱码问题
                   //响应的数据中包含中文:乱码
                   //这里写出去的文字默认使用的是ISO-8859-1,我们可以指定写出去的时候,使用什么编码写

                   //以字符流输出
                   //1.指定输出到客户端的时候,这些文字使用UTF-8编码
                   response.setCharacterEncoding("UTF-8");
                   response.getWriter().write("你好");
                   //2.直接规定浏览器看这份数据的时候,是用什么编码看
                   response.setHeader("Content-Type","text/html; charset=UTF-8");
                   response.getWriter().write("你好");

                   //以字节流输出
                   //默认情况下getOutputStream输出使用的是UTF-8的码表
                   //1.指定浏览器看这份数据的码表
                   response.setHeader("Content-Type","text/html; charset=UTF-8");
                   //2.指定输出的中文用的码表
                   response.getOutputStream().write("你好".getBytes("UTF-8"));

    - - 设置响应的数据类型是Html文本,并且告知浏览器,使用UTF-8来编码
                   reponse.setContentType("text/html;charset=UTF-8"):

    五.演示下载资源

    1. 直接以超链接的方式下载,不写任何代码,也能够下载东西
      让tomcat的默认Servlet去提供下载:<br>
      <a href="download/xx.jpg">xx.jpg</a><br>
      原因是tomcat里面有一个默认的Servlet -- DefaultServlet. 这个DefaultServlet专门用于处理放在tomcat服务器上的静态资源

    2. 手动编码提供下载
      <a href="Demo01?filename=xx.jpg">xx.jpg</a><br>
      //1.获取要下载的文件名字 xx.jpg
      String fileName = request.getParameter("filename");
      //2.获取这个文件在tomcat里面的绝对路径
      String path = getServletContext().getRealPath("download/"+ fileName);
      //让浏览器收到这份资源时,以下载的方式提醒用户,而不是直接展示
      response.setHeader("Content-Disposition","attachment;filename="+fileName);
      //3.转换成输出流
      InputStream is = new FileInputStream(path);
      OutputStream os = response.getOutputStream();
      int len = 0;
      Byte[ ] buffer = new Byte[1024];
      while((len=is.read(buffer)) != -1){
               os.write(buffer,0,len);
      }
      os.close();
      is.close();
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: