Day26 JavaWeb知识 (3)_HTTPServletRequest 和 HTTPServletResponse

一.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. 作用:
    1. 可以获取全局配置参数
      <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);
    2. 可以获取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);
    3. 存储数据,   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..");
                  }
  5. 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. 获取中文问题
    - - 客户端提交数据给服务器端,如果数据中带有中文的话,有可能会出现乱码情况
    1. 如果是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"
    2. 如果是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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值