Servlet笔记

Servlet

一、Servlet规范
  1. Servlet规范来源于JavaEE规范中的一种
  2. 作用:
    1. 在Servlet规范中,指定【动态资源文件】开发步骤
    2. 在Servlet规范中,指定Http服务器调用动态资源文件规则
    3. 在Servlet规范中,只当Http服务器管理动态资源文件实例对象规则
二、Servlet接口实现类
  1. Servlet接口来自于Servlet规范下一个接口,这个接口存在Http服务器
  2. Tomcat服务器下lib文件存在servlet-api.jar文件存放Servlet接口(javax.servlet.Servlet)
  3. Servlet规范中任务,Http服务器能调用的【动态资源文件】必须是一个Servlet接口实现类
class a{
    //不是动态资源文件,Tomcat无权调用
}
class Teacher implements Servlet{
    //合法动态资源文件,Tomcat有权调用
}
Servlet obj=new Teacher();
obj.doGet();
三、Servlet接口实现类开发步骤
  1. 创建Java类继承于HttpServlet父类,使之成为一个Servlet接口实现类
  2. 重写HttpServlet父类两个方法。doGet或者doPost,用哪种方法主要取决于浏览器
  3. 将Servlet接口注册到Tomcat服务器
    【网站】———>【WEB】———>【WEB-INF】———>web.xml
<!--将Servlet接口实现类类路径地址交给Tomcat-->
<servlet>
    <servelt-name>a</servelt-name><!--声明一个变量存储servlet接口实现类类路径-->
    <servlet-class>com.myservlet</servlet-class><!--声明当前servlet接口实现类类路径-->
</servlet>

​ 那么此时在Tomcat中会执行

String a="com.myservlet";
<!--为了降低用户访问Servlet接口实现类难度,需要设置简短别名-->
<servlet-mapping>
    <servlet-name>a</servlet-name>
    <url-pattern>/one</url-pattern><!--设置简单请求别名,在书写时需要以"/"开头-->
</servlet-mapping>
四、Servlet对象生命周期
  1. 网站中所有的servlet接口实现类的实例对象,只能由Http服务器负责创建。

  2. 在默认的情况下,Http服务器接收到对于当前Servlet接口实现类第一次请求时自动创建这个Servlet接口实现类的实例对象

    在手动配置的情况下,要求Http服务器在启动时自动创建某个Servlet接口实现类的实例对象:

    <servlet>
        <servelt-name>a</servelt-name><!--声明一个变量存储servlet接口实现类类路径-->
        <servlet-class>com.myservlet</servlet-class>
        <load-on-startup>6</load-on-startup><!--填写一个大于0的整数-->
    </servlet>
    
  3. 在Http服务器运行期间,一个Servlet接口实现类只会创建出一个实例对象

  4. 在Http服务器关闭时,会自动将网站中所有的Servlet对象进行销毁

五、HttpServletRespsonse接口
  1. 介绍:

    1. HttpServletRespsonse接口来自于Servlet规范中,在Tomcat中存在servelt-api.jar
    2. HttpServletRespsonse接口实现类由Http服务器负责提供
    3. HttpServletRespsonse接口负责将doGet/doPost方法执行结果写入到【响应体】交给浏览器
    4. 开发人员习惯于将HttpServletRespsonse接口修饰的对象称为【响应对象】
  2. 主要功能:

    1. 将执行结果以二进制写入到【响应体】

    2. 设置响应头中[content-type]属性值,从而控制浏览器使用对应编辑器将响应体二进制数据编译为【文字,图片,视频,命令】

    3. 设置响应体中[location]属性值,将一个请求地址赋值给location,从而控制浏览器像指定服务器发送请求

      String result="Hello World";//执行结果
      int money=50;
      //-----将响应对象结果写入响应体-----Start
      PrintWriter out =response.getWriter();//1.通过响应对象,向Tomcat索要输出流
      out.write(result);   //2.通过输出流,将执行结果以二进制写入响应体
      out.write(money);  //会输出2
      out.print(money);
      

      out.write方法可以将【字符】,【字符串】,【ASCII码】写入响应体

      实际开发中,都是通过out.print()将数据写入到数据体

      String result="Java<br/>MySql<br/>HTML<br/>";//执行结果
      //解决方法  response.setContentType("text/html;charset=utf-8");
      PrintWriter out =response.getWriter();
      out.print(result); 
      
      问题描述:Java<br/>MySql<br/>HTML<br/>
          	 浏览器在接收响应结果时,将<br/>作为文字内容在窗口展示,并没有将<br/>当作HTML标签命令来执行
          
      问题原因:浏览器在接收到响应包,根据【响应头中content-type】属性的值,来对应【编译器】对【响应体中二进制内容】进行编译处理
          	 在默认的情况下,content-type属性的值"text" content-type="text"此时浏览器会采用【文本编译器】对响应体二进制数据进行解析
         
      解决方案:在得到输出流之前,通过响应对象对响应头中content-type属性进行一次重新赋值用于指定浏览器采用正确编译器
          	 response.setContentType("text/html");
      		 如果要输出中文,response.setContentType("text/html;charset=utf-8");
      
      String result="http://www.bing.com";
      //通过响应对象,将地址赋值给响应头中location属性
      response.sendRedirect(result);//[响应头  location="http://www.bing.com"]
      
      /*
      浏览器在接受到响应包之后,如果发现
      响应头中存在location属性自动通过
      地址栏向location指定网站发送请求
          
      sendRedirect方法远程控制浏览器请求行为【请求地址,请求方式,请求参数】
      */
      
六、HttpServletRequest接口
  1. 介绍:

    1. HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servelt-api.jar
    2. HttpServletRequest接口实现类由Http服务器负责提供
    3. HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
    4. 开发人员习惯于将HttpServletRequest接口修饰的对象称为【请求对象】
  2. 作用:

    1. 可以读取Http请求协议中【请求行】信息

    2. 可以读取保存在Http请求协议包中【请求头】或者【请求体】中请求参数信息

    3. 可以代替浏览器向Http服务器申请资源文件调用

      //1.通过请求对象,读取【请求行】中【url】信息
      String url=request.getRequestURL().toString();
      //2.通过请求对象,读取【请求行】中【method】信息
      String method=request.getMethod();
      System.out.println("URL:"+url+"method: "+method);
      
      //1.通过请求对象获得【请求头】中【所有请求参数名】
      Enumration paramNames=request.getParameterNames();//将所有请求参数名称保存到一个枚举对象进行返回
      while(paramNames.hasMoreElements()){
          String paramName=(String)paramNames.nextElement();
          //2.通过请求对象读取指定的请求参数的值
          String value=request.getParameter(paramName);
          System.oue.println("请求参数名 "+paramName+"请求参数值"+value);
      }
      
      问题描述:
      		以GET方式发送中文参数内容时,得到正常结果
      		以POST方式发送中文内容时,得到乱码
      原因:
      	浏览器以GEY方式发送请求,请求参数保存在【请求头】,在Http请求协议包到达Http服务器之后,第一件事就是进行解码
      	请求头二进制内容由Tomcat负责解码,Tomcat默认使用【UTF-8】字符集,可以解释一切国家文字
      	
      	浏览器以POST方式发送请求,请求参数保存在【请求体】,在Http请求协议包到达HTTP服务器之后,第一件事就是进行解码
      	请求体二进制内容由当前请求对象(request)负责解码,而request默认使用[ISO-8859-1]字符集,东欧语系字符集
      	此时如果请求体参数是中文,将无法解码会得到乱码
      解决方案:
      		在POST请求方式下,在读取请求体内容之前,应该通知请求对象使用utf-8字符集对请求内容进行一次重新编码
      		request.setCharacterEncoding("utf-8");
      
七、请求对象和响应对象生命周期
  1. 在HTTP服务器接收到浏览器发送的【HTTP请求协议包】之后,自动为当前的【HTTP请求协议包】生成【请求对象】和【响应对象】
  2. 在HTTP服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】作为实参传递方法,确保doGet/doPost正确执行
  3. 在HTTP服务器准备推送HTTP响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】
  • 【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中
  • 【请求对象】和【响应对象】相当于用户在服务端的代言人

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KSsXtjez-1627380592276)(D:\Download\未命名文件.png)]

对象】和【响应对象】作为实参传递方法,确保doGet/doPost正确执行
3. 在HTTP服务器准备推送HTTP响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】

  • 【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中
  • 【请求对象】和【响应对象】相当于用户在服务端的代言人
    请添加图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值