一、Servlet原理
(1)Servlet是使用Java语言编写的运行在服务器端的程序, 主要用于处理客户端传来的Http请求request,并返回一个响应response。狭义的Servlet是指一个接口,广义上的Servlet指的就是实现这个接口的任何类。一般情况下,我们说的Servlet指的就是后者。
GenericServlet类实现了Servlet接口,HttpServlet类继承GenericServlet类,我们自己的类也继承自HttpServlet,并重写doGet()和doPost()方法
(2) 浏览器向web容器(Tomcat服务器)发送Http请求,web容器会判断这个Http请求是不是第一次出现,如果是,web容器就会创建一个Servlet实例(因此在第一次发送Http请求时,响应一般会比较慢);如果不是,则会直接调用已经存在的Servlet。
(3)发送完Http请求后,服务器会创建:一个代表请求的HttpServletRequest对象,用于封装浏览器的请求消息;一个代表响应的HttpServletResponse对象,用于封装响应消息,便于web容器读取。
(4)Servlet再调用service方法,从HttpServletrequest对象中读取请求数据, 把响应消息写入到HttpServletResponse对象中。最后web容器从HttpServletResponse中读取响应数据,并返回给浏览器。
二、helloServlet
(1)创建一个没有模板的maven工程项目,然后在下面创建module
(2)导入Java Servlet API 4.0.1
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
导入servlet.jsp-api
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
记得把scope(范围)删掉,删去后所有作用域下都能使用
(3)配置tomcat 9 不要用10 ,因为上面导的两个jar包只能在tomcat 9里使用,把项目打包成helloservlet.war包发布
Application context是访问项目的路径,和URL后面一致
(4)HelloServlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
//ctrl+鼠标左键能看源码
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter(); //响应流
writer.println("hello servlet.class!!!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
为什么在HelloServlet中的dopost()方法中调用doget()方法?
通常我们使用的都是doPost方法,你只要在servlet中让这两个方法互相调用就行了。
再把业务逻辑直接写在doGet方法中。servlet碰到doPost方法调用直接就会去调用doGet因为他们的参数都一样,避免代码重复使用。
不一定谁一定要放在谁里面,doget方法里面可以调dopost,然后在dopost里面实现你的业务逻辑;或者在dopost里面调用doget,然后在doget里面实现业务逻辑,然后根据表单提交方式,选择调用不同的方法
(5)web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Archetype Created Web Application</display-name>
<!-- 为什么在web.xml中写servlet的映射?因为通过浏览器访问java代码,浏览器需要连接web服务器,-->
<!-- 所以要在web.xml中注册我们写的servlet类,并给一个浏览器能访问的路径-->
<!-- 注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<!-- servlet的映射路径(也就是这个HelloServlet类的请求路径)-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/helloservlet</url-pattern>
</servlet-mapping>
</web-app>
一定要把<web-app>改成下面这种形式,因为idea自动生成的xml版本过低,会导致不匹配
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
(6)index.jsp
<html>
<body>
<h2> show index.html</h2>
</body>
</html>
(7)运行截图