servlet是java web开发的基石,是与平台无关的服务器组件,他是运行在servlet容器(tomcat),负责与客户端通信的组件。
如同简介所说,servlet是一组接口,因此我们想要使用servlet的功能,只需要自定义一个类去继承或者实现改接口即可。那么这个自定义的类就具备了接受客户端请求并作出响应的功能。
public class MyServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { String id = servletRequest.getParameter("id"); System.out.println("我是Servlet,我已经接收到了客户端发来的请求,参数是"+id); servletResponse.setContentType("text/html;charset=UTF-8"); servletResponse.getWriter().write("客户端你好,我已接收到你的请求"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
浏览器不能直接访问Servlet文件,只能通过映射的方式来间接访问Servlet
在web.xml文件为每个Servlet文件进行配置
<servlet> <servlet-name>myservlet</servlet-name> <servlet-class>com.henu.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myservlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
此时启动项目,在地址栏访问/test就可以访问到MyServlet。
只需要在实现了Servlet或继承了其子实现类的自定义类上面添加 WebServlet
注释即可
@WebServlet("/test") public class MyServlet implements Servlet { }
注解的方式与配置想,xml所实现的效果一致
1、当浏览器访问 Servlet 的时候,Tomcat 会查询当前 Servlet 的实例化对象是否存在,如果不存在, 则通过反射机制动态创建对象,如果存在,直接执⾏第 3 步。
2、调⽤ init ⽅法完成初始化操作。
3、调⽤ service ⽅法完成业务逻辑操作。
4、关闭 Tomcat 时,会调⽤ destory ⽅法,释放当前对象所占⽤的资源。
Servlet 的⽣命周期⽅法:⽆参构造函数、init、service、destory
1、⽆参构造函数只调⽤⼀次,创建对象。
2、init 只调⽤⼀次,初始化对象。
3、service 调⽤ N 次,执⾏业务⽅法。
4、destory 只调⽤⼀次,卸载对象。
####ServletConfig
该接⼝是⽤来描述 Servlet 的基本信息的。
GenericServlet 实现 Servlet 接⼝,同时为它的⼦类屏蔽了不常⽤的⽅法,⼦类只需要重写 service ⽅ 法即可。 HttpServlet 继承 GenericServlet,根据请求类型进⾏分发处理,GET 进⼊ doGET ⽅法,POST 进⼊ doPOST ⽅法。
我们只需要⾃定义的 Servlet 类只需要继承 HttpServlet 即可,重新实现 doGET 和 doPOST。
package com.henu.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/test") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("GET"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("POST"); } }
1、request:表示⼀次请求,HttpServletRequest。
2、response:表示⼀次响应,HttpServletResponse。
3、pageContext:⻚⾯上下⽂,获取⻚⾯信息,PageContext。
4、session:表示⼀次会话,保存⽤户信息,HttpSession。
5、application:表示当前 Web 应⽤,全局对象,保存所有⽤户共享信息,ServletContext。
6、config:当前 JSP 对应的 Servlet 的 ServletConfig 对象,获取当前 Servlet 的信息。
7、out:向浏览器输出数据,JspWriter。
8、page:当前 JSP 对应的 Servlet 对象,Servlet。
9、exception:表示 JSP ⻚⾯发⽣的异常,Exception。
常⽤的是 request、response、session、application、pageContext
1、String getParameter(String key) 获取客户端传来的参数。
2、void setAttribute(String key,Object value) 通过键值对的形式保存数据。
3、Object getAttribute(String key) 通过 key 取出 value。
4、RequestDispatcher getRequestDispatcher(String path) 返回⼀个 RequestDispatcher 对象,该对 象的 forward ⽅法⽤于请求转发。
5、String[] getParameterValues() 获取客户端传来的多个同名参数。
6、void setCharacterEncoding(String charset) 指定每个请求的编码。
200:正常
404:资源找不到
400:请求类型不匹配
500:Java 程序抛出异常
sendRedirect(String path) 重定向,⻚⾯之间的跳转。
转发是将同⼀个请求传给下⼀个⻚⾯,重定向是创建⼀个新的请求传给下⼀个⻚⾯,之前的请求结束⽣ 命周期。 转发:同⼀个请求在服务器之间传递,地址栏不变,也叫服务器跳转。 重定向:由客户端发送⼀次新的请求来访问跳转后的⽬标资源,地址栏改变,也叫客户端跳转。 如果两个⻚⾯之间需要通过 request 来传值,则必须使⽤转发,不能使⽤重定向。
4个
page、request、session、application
通过进行设置和取出共享变量:
setAttribute、getAttribute
作⽤域:
page 作用域:对应的内置对象是 pageContext。
request 作⽤域:对应的内置对象是 request。
session 作⽤域:对应的内置对象是 session。
application 作⽤域:对应的内置对象是 application。
作用域的共享范围:
page < request < session < application
page 只在当前⻚⾯有效。
request 在⼀次请求内有效。
session 在⼀次会话内有效。
application 对应整个 WEB 应⽤的。
网站访问量统计
<% Integer count = (Integer) application.getAttribute("count"); if(count == null){ count = 1; application.setAttribute("count",count); }else{ count++; application.setAttribute("count",count); } %> 您是当前的第<%=count%>位访客