Servlet 简介(2)

Servlet 其他接口

1、HttpServlet

HttpServlet 继承了 GenericServlet,而 GenericServlet 实现 Servlet 接口,可以同构继承HttpServlet来创建一个Servlet。

HttpServlet重写service()方法:

      1)在该方法中先将ServletRequest和ServletResponse 强转为了HttpServletRequest和HttpServletResponse
      2)然调用重载的service()方法,并将刚刚强转得到对象传递到重载的方法中。

重载service(HttpServletRequest request , HttpServletResponse response)
      【1】在方法中获取请求的方式(get或post)
      【2】在根据不同的请求方式去调用不同的方法:
      如果是GET请求,则调用doGet(HttpServletRequest request , HttpServletResponse response)
      如果是post请求,则调用doPost(HttpServletRequest request , HttpServletResponse response)
结论:
      当通过继承HttpServlet来创建一个Servlet时,我们只需要根据要处理的请求的类型,来重写不同的方法。
      【1】处理get请求,则重写doGet()
      【2】处理post请求,则重写doPost()

2、HttpServletRequest

      定义:浏览器发送给服务器的请求报文。
      获取:该对象由Tomcat服务器创建,最终作为参数传递到doGet或doPost方法中,我们可以在这两个方法中直接使用。
      功能:
      【1】获取用户发送的请求参数
request.getParameter(“username”);
      【2】获取项目的名字(用来设置绝对路径)
request.getContextPath();
      【3】作为一个域对象,在不同的WEB资源之间共享数据。
      【4】请求的转发
                        request.getRequestDispatcher(“target.html”).forward(request, response);

3、HttpServletResponse

      定义:服务器发送给浏览器的响应报文。
      获取:该对象由Tomcat服务器创建,最终作为参数传递到doGet或doPost方法中,我们可以在这两个方法中直接使用。
      功能:
      【1】响应给浏览器一个网页或者是网页片段(设置的是响应报文的响应体)
response.getWriter("");
      【2】请求的重定向
response.sendRedirect(“target.html”);

4、字符编码
  • 当用户通过表单向Servlet发送中文请求参数时,Servlet获取到内容会产生乱码
  • 当Servlet向浏览器响应中文内容时,会产生乱码。
  • 浏览器和服务器之间通信时,中文内容时不能直接发送的,需要对中文进行编码。

编码:
      将字符转换为二进制码的过程叫编码。

解码:
      将二进制码转换为普通字符的过程叫解码。
      编码和解码所采用的规则我们称为字符集。

产生乱码问题的根本原因:编码和解码所采用的字符集不同。

解决方法:统一编码和解码的字符集为UTF-8。

常见字符集:
      1.ASCII
      2.ISO8859-1
      3.GBK
      4.GB2312
      5.UTF-8

请求编码
      1)请求是浏览器发送给服务器的。
      2)浏览器 --> 服务器
      3)浏览器 编码
            浏览器的会自动使用网页的字符集对参数进行编码
            UTF-8的张三:%E5%BC%A0%E4%B8%89
            GBK的张三:%D5%C5%C8%FD

所以只需统一网页的字符集为UTF-8就行。

      4)服务器 解码

            post请求
                > request解码时默认字符集时iso8859-1,但是iso压根就不支持中文
                > post请求在servlet中解码,所以我们只需要指定request的字符集即可。
                > 我们可以通过如下方法,来设置request的字符集:
                    request.setCharacterEncoding("utf-8");
                > 注意:
                    该方法要在request.getParameter()第一次调用之前调用

            get请求
                > get请求是通过url地址传递请求参数,url中的请求参数将会被Tomcat服务器自动解码。
                > Tomcat的默认编码是iso8859-1,但是iso压根就不支持中文,所以必然乱码。
                > 只需要修改Tomcat的解码的默认字符集,修改配置文件server.xml
                > 在server.xml的Connector标签中(改端口号的那个标签)添加如下属性:
                    URIEncoding="utf-8"
                > 修改完配置文件以后,get请求的编码就不用再处理的,但是post请求还是老样子。

响应编码
      1)响应是服务器发送给浏览器
      2)服务器 --> 浏览器
      3)服务器 编码
            指定服务器的编码字符集为UTF-8。
            指定response的字符集
                  response.setCharacterEncoding(“utf-8”);
            虽然我们已经指定了response的字符集为utf-8,但是浏览器并不是用utf-8解码。
       浏览器默认使用gb2312解码的,所以依然乱码,只不过没有那么乱。

      4)浏览器 解码

浏览器的解码字符集可以通过浏览器来设置(不靠谱)
我们可以通过服务器来告诉浏览器,我们的内容的编码格式为utf-8
我们可以通过一个响应头来告诉浏览器,内容的编码格式:
	Content-Type:text/html;charset=utf-8
通过response的方法,来设置响应头:
	response.setHeader("Content-Type", "text/html;charset=utf-8");

解决方案:

设置响应头
	response.setHeader("Content-Type", "text/html;charset=utf-8");
设置response的编码格式
	response.setCharacterEncoding("utf-8");

当我们设置Content-Type这个响应头时,服务器会自动使用响应头中的字符集为内容编码。

最终方案:
	response.setContentType("text/html;charset=utf-8");
总结:
        post请求:
          在request.getParameter()方法第一次调用之前,调用如下代码:
                    request.setCharacterEncoding("utf-8");
        get请求:
          修改server.xml配置文件
          <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
响应:
       设置一个Content-Type响应头:response.setContentType("text/html;charset=utf-8");
5、路径问题

(1)URI和URL
       URL是URI的一种实现,也是URI最常见的实现方式。
       URI有两种实现方式URL和URN,URN用的很少
       我们说URL和URI实际上可以理解为一个意思

(2) URL地址的格式:http://主机名:端口号/项目名/资源路径/资源名

      ①相对路径和绝对路径
【1】相对路径
      之前我们使用的路径全都是相对路径:
      所谓的相对路径指相对于当前资源所在路径:http://主机名:端口号/项目名/资源路径/
      由于转发的出现,相对路径会经常发生变化,容易出现错误的链接
      ——所以在开发中我们一般不使用相对路径,而是使用绝对路径。

【2】绝对路径
      绝对路径使用 / 开头
      由浏览器解析的绝对路径中的/代表的是服务器的根目录: http://主机名:端口号/
注意:需要加上项目名

      由服务器解析的绝对路径中的/代表的项目的根目录:
            http://主机名:端口号/项目名/
            注意:不要加项目名

      转发的路径由服务器解析,设置绝对路径时不需要加项目名
      重定向的路径由浏览器解析,设置绝对路径时需要加上项目名

      ②常见的路径:
      url-pattern:
      转发的路径:
            url-pattern和转发中的路径都是由服务器解析的,
            根目录是项目的根目录:
            http://主机名:端口号/项目名/
      所以这两个路径不需要加项目名

        重定向的路径:
        页面中的路径:
            重定向和页面中的路径(HTML标签中的路径),由浏览器解析的,
                根目录是服务器的根目录:
                    http://主机名:端口号/
            所以这个两个路径必须加上项目名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值