javaWeb02-Servlet
本文参考了这篇博客:Servlet、Servlet容器等内容讲解 - 江清澜静 - 博客园 (cnblogs.com)
一. Servlet的创建
1. Servlet接口的定义
Servlet接口,GenericServlet实现类, HttpServlet实现类的关系如图所示
GenericServlet实现了Servlet接口,HttpServlet继承了GenericServlet。
2. Servlet接口的实现
HelloServlet实现Servlet接口,声明如下
public class HelloServlet implements Servlet { public HelloServlet() { System.out.println("构造器方法 HelloServlet"); } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("初始化方法 init"); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("处理请求 service"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("销毁 destroy"); } }
注意:需要在web.xml文件中配置相关信息。
web.xml文件声明如下
<servlet> <servlet-name>Hello</servlet-name> <servlet-class>com.hsp.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
<servlet>标签中:<servlet-class>标签是需要访问的servlet程序的位置【包名 . 类名】;<servlet-name>标签是给这个servlet程序起一个别名
<servlet-mapping>标签:建立 url 和 servlet程序的映射关系
<servlet-name>标签 即 在<servlet>标签中的<servlet-name>给servlet程序取的别名;
<url-pattern>标签 就是 加上了一截其他的字符串,实际上通过浏览器翻出请求后,Tomcat将应用上下文路径截掉只剩下一个字符串作为servlet的映射匹配。
url-pattern的理解:参看这篇博客(229条消息) 理解servlet的url-pattern_ApplauseWow的博客-CSDN博客
上下文路径的理解:参看这篇博客(229条消息) 理解上下文路径问题_零零JA的博客-CSDN博客_上下文路径
具体映射流程如下:
当用户通过浏览器直接访问:localhost:8080/javaWeb01/hello后,
tomcat服务器做了如下操作
运行结果如下
构造器方法 HelloServlet
初始化方法 init
处理请求 service
当关闭web项目时,才会打印销毁 destroy。
3. HelloServlet处理请求
3.1 在web目录下创建pages文件夹,并在pages目录下,创建test.html
test.html【POST请求】声明如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="http://localhost:8080/javaWeb01/hello" method="POST"> 用户: <input type="text" name="username"/><br/> 密码: <input type="text" name="password"/><br/> <input type="submit" value="提交"> </form> </body> </html>
test.html【GET请求】声明如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="http://localhost:8080/javaWeb01/hello" method="GET"> 用户: <input type="text" name="username"/><br/> 密码: <input type="text" name="password"/><br/> <input type="submit" value="提交"> </form> </body> </html>
HelloServlet实现类通过service()方法处理请求,service()方法声明如下
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("处理请求 service"); servletRequest.setCharacterEncoding("utf-8"); String username = servletRequest.getParameter("username"); String password = servletRequest.getParameter("password"); System.out.println(username + ", " + password); }
两次请求得到的结果:
处理请求 service Tom, 123 处理请求 service Tom, 123
问题:如何区分这两种不同的请求呢?
将 ServletRequest servletRequest 对象强转成 HttpServletRequest类型,调用HttpServletRequest的getMethod()方法
此时service()方法声明如下
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("处理请求 service"); servletRequest.setCharacterEncoding("utf-8"); HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; String method = httpServletRequest.getMethod(); if(method.equals("GET")){ // 处理GET请求 doGet(); }else if(method.equals("POST")){ // 处理POST请求 doPost(); } } // 处理GET请求 public void doGet(){ System.out.println("这是一个get请求"); } // 处理POST请求 public void doPost(){ System.out.println("这是一个post请求"); }
分别处理这两种不同的请求,运行结果如下
处理请求 service
这是一个get请求
处理请求 service
这是一个post请求
目前,编写servlet程序,最常用的就是继承HttpServlet实现类
如HelloServlet2声明如下
public class HelloServlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get请求:"); String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username + "," + password); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post请求:"); req.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username + "," + password); } }
二. Servlet的作用