1.简介

servlet 是运行在 Web 服务器中的小型 Java 程序。
处理Http请求 产生Http响应

servlet开发步骤

① 创建一个类继承HttpServlet
② 重写doGet doPost方法 分别用来处理get方式和post方式的请求
③ 在web.xml 配置访问到servlet的具体路径

2.servlet配置文件

如果想要访问到servlet程序 需要在web.xml中配置一个servlet节点

  1. <servlet>
  2. <servlet-name>hello</servlet-name> <!--可以任意取名字 根据servlet的业务逻辑取名字-->
  3. <servlet-class>cn.yshye.Hello</servlet-class><!--声明的servlet的全路径-->
  4. <init-param> <!--声明的servlet的配置参数-->
  5. <param-name>encoding</param-name>
  6. <param-value>gbk</param-value>
  7. </init-param>
  8. </servlet>
  9. <servlet-mapping>
  10. <servlet-name>hello</servlet-name> <!--要跟serlet节点下的servlet-name对应起来-->
  11. <url-pattern>/hello</url-pattern> <!--通过这个url-pattern来确定 访问servlet的路径-->
  12. </servlet-mapping>

image.png

3.servlet运行原理和生命周期

image.png

  • 构造 初始化 init 当 servlet 创建的时候会调用 构造 和 init 方法 (只会调用一次) 默认的情况当web应用运行起来 不会创建servlet对象 只有当有人访问servlet的时候才会创建
  • 可以在web.xml中配置,服务器启动就会加载对应的servlet

    <load-on-startup>1</load-on-startup>
    
  • service 当客户端向服务端发出一个http请求 servlet收到请求之后 会调用service方法 service方法 会获取请求的方式,根据不同的请求方式调用不同的doXXX()方法 doGet doPost doHead doDelete doTrace doOptions doPut

  • destory 当servlet被创建之后 servlet对象就会被缓存起来 直到服务器正常关闭servlet对象才回销毁 销毁的时候会调用destory方法

    4.servlet配置文件 url-pattern的几种写法

    ①完整路径匹配
<url-pattern>/lifecycle</url-pattern>

②目录匹配

<url-pattern>/*</url-pattern>

③扩展名匹配

<url-pattern>*.do</url-pattern>

优先级:①完整路径匹配>②目录匹配>③扩展名匹配

5 提交参数时 绝对路径和相对路径

  • 绝对路径 :把访问到要提交参数的servlet的url地址 截取服务器ip之后的路径 作为访问的绝对路径
<form action="/day07_01_servlethello/cfb" method="get">
  • 相对路径: 根据当前项目的目录结构 如果html网页与servlet的访问路径在同一级目录 直接写servlet的urlpattern就可以了
<form action="cfb" method="get">

如果 html网页与servlet的访问路径不在同一级目录 可以通过../返回上一级目录
在真实开发环境中一般使用绝对路径

6. servletConfig

通过servletConfig可以获取跟servlet相关的配置信息

获取servletConfig对象方法

  1. 从写init(),在init方法中通过一个成员变量保存传入的ServletConfig ```java @Override public void init(ServletConfig config) throws ServletException { super.init(config); this.config =config; }

2. getServletConifg();通过这个方法获取servletConfig对象
```java
ServletConfig config = getServletConfig();

通过ServletConfig获取初始化参数

<servlet>
   <servlet-name>lifecycle</servlet-name>
    <servlet-class>com.itheima.servlet.LifeCycle</servlet-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>gb2312</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

在servlet节点下 添加一个节点。
通过servletConfig对象调用。

String encoding = config.getInitParameter("encoding");

需要注意 通过servletconfig获取的初始化参数只对当前servlet有效。

7.ServletContext

每一个Servlet应用程序都对应着唯一一个ServletContext
这个ServletContext跟整个Servlet应用的生命周期保持一致 web应用创建 ServletContext创建 web应用创销毁ServletContext销毁

获取ServletContext对象

ServletContext context = config.getServletContext();//通过servletconfig对象获取
ServletContext context2 = getServletContext();  //直接通过方法获取

通过ServletContext可以在不同的Servlet之间传递参数

// 通过servletContext 设置一个参数
context.setAttribute("p", "hello");
// 在任何一个Servlet中 都可以通过P来获取到对应的内容
ServletContext context2 = getServletContext();
String  attribute = (String) context.getAttribute("p");

通过ServletContext可以获取在web.xml中配置的全局参数

<context-param>
  <param-name>encoding</param-name>
  <param-value>iso-8859-1</param-value>
</context-param>

获取全局参数的方法

parameter = context.getInitParameter("encoding");

8.通过request获取参数

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //response.getWriter().append("Served at: ").append(request.getContextPath());
    String method = request.getMethod(); //获取请求的方法
    String protocol = request.getProtocol();   //获取请求使用的协议
    String requestURI = request.getRequestURI(); //获取请求的路径
    System.out.println("method"+method+"protocol"+protocol+"requestURI"+requestURI);
    String header = request.getHeader("User-Agent");
    System.out.println("header:"+header);

    String object = request.getParameter("请求参数1");
    System.out.println("object="+object);
    String[] values = request.getParameterValues("请求参数数组");
    for(String temp:values){
        System.out.println(temp);
    }
    response.getWriter().print("你好");
}

9.servlet 可能遇到的中文乱码问题

产生乱码的原因:Tomcat服务器 默认采用的编码是iso-8859-1 这个字符集中没有中文的字符

处理response的乱码

  1. 设置当前的输出流采用utf-8
response.setCharacterEncoding("utf-8");
  1. 通知客户端 使用utf-8进行解码(通过设置响应头实现)
response.setHeader("Content-Type", "text/html;charset=utf-8");
  1. 可以通过一行代码 实现上面两行的效果
response.setContentType("text/html;charset=utf-8");

处理request乱码

post方式 处理比较简单 参数都是通过请求体提交上来的 可以通过方法设置请求体使用的编码集

//这个方法只对请求体有效果
request.setCharacterEncoding("utf-8");
String parameter = request.getParameter("param");

get方式 由于参数是通过url地址拼接来的 上述方法对get方式没有效果
提交中文参数到url地址栏 都会先进行url编码 把中文的内容按照网页上传入的字符集进行编码获取到bye数组的内容放到地址栏上
提交到tomcat服务器后

String parameter = request.getParameter("param");//默认使用iso-8859-1
//①还原成二进制 
byte[] temp = parameter.getBytes("iso-8859-1");
//②拿着二进制用utf-8重新编码
parameter = new String(temp,"utf-8");

如果涉及到中文内容需要提交 建议使用post方式提交

10.通过sevlet处理上传文件

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取文件夹的路径
    String path = getServletContext().getRealPath("WEB-INF/upload");
    //上传的文件会转成一个part对象
    Part part = request.getPart("file");
    //通过part把上传的内容写到本地
    part.write(path+"/文件名");
    //设置输出流使用的字符集 通知浏览器使用utf-8处理内容
    response.setContentType("text/html;charset=utf-8");
    //如果write方法没有抛异常 说明上传成功
    response.getWriter().print("上传成功");
}