servlet

它是运行在web服务器端的一个java小程序

Servlet它是一个资源,用来被用户访问的资源,同时也是一个动态资源
Servlet的作用:它是基于Http协议,主要用来接收客户端发送的请求,处理请求,报数据响应给客户端
image.png

实现servlet程序

1 .实现servlet接口
2. 实现service方法( service方法专门处理请求并响应数据 )只要有请求就会用到这个方法
3.到web.xml 中去配置servlet程序的访问地址

  1. public class Servlet extends HttpServlet {
  2. @Override
  3. //只要有请求就会用到这个方法
  4. public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
  5. super.service(req, res);
  6. System.out.println("services methods...");
  7. }
  8. }
  9. <!--给servlet标签配置servlet程序-->
  10. <servlet>
  11. <!--给servlet程序起一个别名(一般是类名)-->
  12. <servlet-name>hello</servlet-name>
  13. <!--servlet程序的全类名地址 类包下的路径-->
  14. <servlet-class>TestServlet.helloservlet</servlet-class>
  15. </servlet>
  16. <!--给servlet程序的配置访问地址-->
  17. <servlet-mapping>
  18. <!--告诉服务器当前配置的地址是给哪个servlet程序使用(一般和别名一致)-->
  19. <servlet-name>hello</servlet-name>
  20. <!--配置访问地址
  21. / 斜杠在服务器解析的时候 表示为:http://ip:port/工程路径
  22. /hello 表示地址为:http://ip:port/工程路径/hello 即资源路径
  23. -->
  24. <url-pattern>/hello</url-pattern>
  25. </servlet-mapping>
  26. 注:相当于注解 @WebServlet("/hello")

image.png

servlet的生命周期
执行servlet构造器方法,执行init初始化方法,执行service方法,执行destory方法

Servlet的接口和实现类:

servlet是一个接口
image.png
Genericservlet 它是一个类,实现了servlet接口
Httpservlet 它是一个类,继承Genericservlet

请求分发处理

  1. @Override
  2. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  3. System.out.println(" service被访问了");
  4. // 类型转换(因为它有getMethod()方法)
  5. HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
  6. // 获取请求的方式
  7. String method = httpServletRequest.getMethod();
  8. if ("GET".equals(method)) {
  9. doGet();
  10. } else if ("POST".equals(method)) {
  11. doPost();
  12. }
  13. }

一般开发中,创建servlet,通常去继承httpservlet
1 重写doGET或doPOST方法
2 到web.xml中的配置servlet程序访问地址
注:httpservlet中的service方法已经封装好了请求分发处理 只需要调用方法就行了

ServletConfig类

servlet程序的配置信息类。用于做初始化

作用:
1 可以获取servlet 程序的别名 servlet-name 的值
2 可以获取初始化参数 init-param
3 获取 servletContext 对象

servlet程序默认是第一次访问的时候创建,ServletConfig是每个servlet程序创建时,就创建一个对应的ServletConfig对象。

  1. //web.xml 配置文件
  2. <servlet>
  3. <servlet-name>helloServlet</servlet-name>
  4. <servlet-class>servletTest.Servlet</servlet-class>
  5. <init-param>
  6. <param-name>username</param-name>
  7. <param-value>H</param-value>
  8. </init-param>
  9. <init-param>
  10. <param-name>root</param-name>
  11. <param-value>abc123</param-value>
  12. </init-param>
  13. </servlet>
  14. //用于做初始化使用
  15. public class Servlet extends HttpServlet {
  16. @Override
  17. public void init(ServletConfig config) throws ServletException {
  18. //获取别名
  19. System.out.println(config.getServletName());
  20. //获取初始化参数
  21. System.out.println(config.getInitParameter("username"));
  22. System.out.println(config.getInitParameter("root"));
  23. //获取servletContext对象
  24. System.out.println(config.getServletContext());
  25. }
  26. }

ServletContext类

ServletContext是一个接口,表示servlet上下文对象。
一个web工程,只有一个ServletContext对象实例。
ServletContext对象是一个域对象。
ServletContext是在web工程部署启动的时候创建,工程停止时销毁

作用:
1 获取web.xml 中配置的上下文参数 context-param
2 获取当前的工程路径
3 获取工程部署后在服务器硬盘上的绝对路径
4 像Map一样存取数据

域对象

可以像Map一样存取数据的对象。域指的是存取数据的操作范围
方法 setAttribute,getAttribute,removeAttribute

  1. //web.xml配置文件
  2. //context-param 是上下文参数(它属于整个web工程)
  3. <context-param>
  4. <param-name>user</param-name>
  5. <param-value>H</param-value>
  6. </context-param>
  7. //ServletContext作用:
  8. @Override
  9. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  10. //1 获取web.xml 中配置的上下文参数 context-param
  11. ServletContext context=getServletContext();
  12. System.out.println(context); //一个web工程,只有一个ServletContext对象实例
  13. System.out.println(context.getInitParameter("user"));
  14. //2 获取当前的工程路径
  15. System.out.println("工程路径 "+context.getContextPath());
  16. //3 获取工程部署后在服务器硬盘上的绝对路径
  17. // "/"斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到IDEA代码的web目录
  18. System.out.println("绝对路径 "+context.getRealPath("/"));
  19. System.out.println("工程下文件的绝对路径 "+context.getRealPath("/a.html"));
  20. //4 像Map一样存取数据
  21. context.setAttribute("key1","value1");
  22. context.setAttribute("key2","value2");
  23. context.setAttribute("key3","value3");
  24. System.out.println(context.getAttribute("key1"));
  25. System.out.println(context.getAttribute("key2"));
  26. System.out.println(context.getAttribute("key3"));
  27. }

HttpServletRequest类

每次有请求进入Tomcat服务器,服务器就会把请求过来的HTTP协议信息解析封装好到Reuqest对象中。然后传递到Service方法中供我们使用。通过HttpServletRequest对象,获取到所有请求的信息
**

  1. //常用方法
  2. public class RequestServlet extends HttpServlet {
  3. @Override
  4. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5. request.setCharacterEncoding("utf-8"); //解决post请求获取参数时的乱码问题
  6. //获取资源路径
  7. System.out.println("url--"+req.getRequestURI());
  8. //获取绝对路径
  9. System.out.println("url--"+req.getRequestURL());
  10. //获取客户端ip地址
  11. System.out.println("ip--"+req.getRemoteHost());
  12. //获取请求头
  13. System.out.println("user_agent--"+req.getHeader("user-agent"));
  14. //获取请求方式
  15. System.out.println("请求方式"+req.getMethod());
  16. //获取请求参数
  17. String username = req.getParameter("username");
  18. System.out.println("用户名"+username);
  19. String pwd = req.getParameter("pwd");
  20. System.out.println("密码"+pwd);
  21. String[] hob=req.getParameterValues("hob");
  22. System.out.println("爱好"+Arrays.asList(hob));
  23. }
  24. }

请求转发

服务器收到请求后,从一次资源跳转到另一个资源的操作

特点:
浏览器地址无变化;
它们是一次请求;它们共享Request域中的数据;
可以转发到WEB-INF目录下;不能访问工程外的资源

  1. public class servlet1 extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. String username = req.getParameter("username");
  5. System.out.println("在s1中查看参数"+username);
  6. //加一个值作为标识
  7. req.setAttribute("key1","s1");
  8. //转发的地点 以 / 开头 映射到web目录
  9. RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
  10. //转发
  11. requestDispatcher.forward(req,resp);
  12. }
  13. }
  14. public class servlet2 extends HttpServlet {
  15. @Override
  16. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  17. String username = req.getParameter("username");
  18. System.out.println("在s2中查看参数"+username);
  19. //查看标识
  20. Object key1 = req.getAttribute("key1");
  21. System.out.println("s1是否有标识"+key1);
  22. //处理自己业务
  23. System.out.println("处理自己业务");
  24. }
  25. }

base标签

可以设置当前页面中所有相对路径工作时,参照哪个路径进行跳转。

  1. <head>
  2. <base href="src...">
  3. </head>

web中 / 的不同意义
在web中 / 是一种绝对路径
/ 被浏览器解析,得到的地址是 http://ip:port
/ 被服务器解析,得到的地址是http://ip:port/工程路径

HttpServletResponse类

每次有请求进入Tomcat服务器,服务器就会创建一个Response对象传递给servlet程序去使用。HttpServletResponse 表示所有响应的信息

  1. public class helloservlet extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. //设置服务器字符集
  5. resp.setCharacterEncoding("utf-8");
  6. //同时设置服务器和客户端都使用utf-8字符集 要在获取流对象之前才有效 法一
  7. //resp.setContentType("text/html; charset=utf-8");
  8. //通过响应头 设置浏览器也使用UTF-8字符集 解决响应乱码问题 法二
  9. resp.setHeader("content-type","text/html;charset=utf-8");
  10. //往客户端回传数据
  11. PrintWriter writer = resp.getWriter();
  12. writer.write("不是语句");
  13. }
  14. }

请求重定向

客户端给服务端发送请求,提供一个新的地址去访问。
特点:
浏览器地址栏变化;
发起了两次请求;不共享Request域中的数据;
不能访问WEB-INF下的资源;可以访问工程外的资源

  1. //法一
  2. public class servlet1 extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5. System.out.println("s1到此一游");
  6. //设置响应码 表示重定向
  7. resp.setStatus(302);
  8. //设置响应头 说明新的地址
  9. resp.setHeader("location","http://localhost:8080/Tservlet/servlet2");
  10. //resp.setHeader("location","https://www.baidu.com/"); 重定向到工程外的资源
  11. }
  12. }
  13. public class servlet2 extends HttpServlet {
  14. @Override
  15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16. resp.getWriter().write("r2");
  17. }
  18. }
  19. //法2 推荐使用
  20. public class servlet1 extends HttpServlet {
  21. @Override
  22. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  23. System.out.println("s1到此一游");
  24. resp.sendRedirect("https://www.baidu.com/");
  25. }
  26. }