servlet
做java有一段时间了,发现大多数时间都是在机械式的,条件反射一般的开发功能,慢慢的忘了一些底层的原理,最近抽时间总结一下基础的知识。
什么是Servlet
说的java web 开发就不得不提到servlet,那么什么是servlet呢?
- servlet是JavaEE的规范,规范就是接口。
- servlet是javaWeb的三个核心组件之一,三大核心组件分别是Servlet,Filter过滤器和Listener监听器。
- servlet接收客户端发送的请求,并且返回数据给客户端。
手动实现servlet程序
手动实现servlet程序,实现前端的请求发送到后台需要如下操作
- 新建一个MyServlet类实现Servlet 接口
- 实现Servlet接口的方法,对service 方法做修改
- 在web.xml中配置创建的MyServlet
```java
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
//客户端根据请求地址发送请求后,进入后台的service方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("myservlet 进入到service方法");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<servlet>
<!--起一个名称-->
<servlet-name>myServlet</servlet-name>
<!--自己手动创建的servelt类-->
<servlet-class>com.myTest.MyServlet</servlet-class>
</servlet>
<!--配置拦截客户端发过来的请求路径-->
<servlet-mapping>
<!--使用哪个servlet拦截这个路径,对应上面的servlet-name-->
<servlet-name>myServlet</servlet-name>
<!--该servlet拦截的路径-->
<url-pattern>/</url-pattern>
<!-- / 拦截的请求对应的是http://ip:port/工程名 下的所有的请求-->
<url-pattern>/myservlet</url-pattern>
<!-- / 拦截的请求对应的是http://ip:port/工程名/myservlet 下的所有的请求-->
</servlet-mapping>
<!--一般来说一个端口下只有一个正在运行的程序-->
</web-app>
请求路径:
运行结果:
表明客户端通过请求被 myServlet接收对了请求,然后进入到service方法中了。
servlet生存周期
1.构造方法
2.执行init方法 ----第一二步当创建servlet时会调用
3.执行service方法 -----每次接收到请求的时候调用
4执行destory方法 ----web工程停止的时候调用
servlet处理post和get请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="http://localhost:8080/Servlet01/myservlet" method="post">
姓名<input type="text" name="name" value="张三">
爱好<input type="text" name="hobby" value="篮球">
<input type="submit" name="提交">
</form>
</body>
</html>
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("myservlet 进入到service方法");
//servletRequest请求没有getMethod方法,所以要强转一下
HttpServletRequest req=(HttpServletRequest)servletRequest;
String method=req.getMethod();
System.out.println("method"+method);
if(method.equals("post")){
System.out.println("当前请求是"+method+"请求");
}else{
System.out.println("当前请求是"+method+"请求");
}
}
servlet 接收并处理不同的请求,本质就是根据方法获取请求的类型,然后进行不同的操作。但是在实际业务中并不是这么用的实际开发 中使用HttpServlet更多一些
Servlet的类的继承关系
在上面的GenericServlet中提到了ServletConfig类,下面对ServletConfig进行讲解
什么是ServletConfig
ServletConfig是由tomcat创建的,当每次由请求到达tomcat 服务器的时候,tomcat创建Servlet程序,Servlet程序创建时,回生成一个ServletConfig,来让我们对Servlet的一些配置信息进行操作
ServletConfig的作用
1.获取servlet的名称,即标签中的属性
2.获取servlet的初始化参数,即标签中的属性的值
3.获取ServletContext
<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">
<context-param>
<param-name>userName</param-name>
<param-value>zhangsan</param-value>
</context-param>
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.myTest.MyServlet</servlet-class>
<init-param>
<param-name>student</param-name>
<param-value>name</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TestHttpServlet</servlet-name>
<servlet-class>com.myTest.TestHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestHttpServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
</web-app>
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
;
;
System.out.println("servletname="+servletConfig.getServletName());
System.out.println("servletname="+servletConfig.getInitParameter("student"));
System.out.println("servletname="+servletConfig.getServletContext());
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("myservlet 进入到service方法");
HttpServletRequest req=(HttpServletRequest)servletRequest;
String method=req.getMethod();
System.out.println("method"+method);
if(method.equals("post")){
System.out.println("当前请求是"+method+"请求");
}else{
System.out.println("当前请求是"+method+"请求");
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
什么是 ServletContext
1.ServletContext是一个接口,表示一个工程的上下文对象
2.一个工程只有一个ServletContext上下文对象,只有一个ServletContext对象实例,所有servlet共享
3.servletContext是一个域对象
4.servletContext对象在工程启动是创建,工程地址是销毁
什么是域对象
1.域对象可以像Map一样存取数据
2.这个域对象的范围就是整个工程
存 取 删除
Map get() put() remove()
域对象 getAttribute() setAttribute() removeSetAttribute()
ServletContext的作用
1.获取web.xml中的context-param参数的值
2.获取当前的工程路径
3.获取项目部署在服务器上的绝对路径
4.像Map一样存取数据
public class ContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
getServletConfig();
ServletContext context=getServletContext();
System.out.println("获取context-param的值"+context.getInitParameter("userName"));
System.out.println("获取context-param的值"+context.getInitParameter("password"));
System.out.println("获取项目的工程路径"+context.getContextPath());
System.out.println("获取项目部署在服务器上的绝对路径"+context.getRealPath("/index.jsp"));
//往ServletContext中存值
context.setAttribute("key","key1");
}
}
public class ContextServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext();
//先要请求context1
System.out.println(context.getAttribute("key")); ;
}
}
<context-param>
<param-name>userName</param-name>
<param-value>zhangsan</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
<servlet>
<servlet-name>ContextServlet</servlet-name>
<servlet-class>com.myTest.ContextServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContextServlet</servlet-name>
<url-pattern>/context1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ContextServlet2</servlet-name>
<servlet-class>com.myTest.ContextServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContextServlet2</servlet-name>
<url-pattern>/context2</url-pattern>
</servlet-mapping>