Servlet 基础知识点
前言
上一篇博客,我记录了一些有关jsp的基础知识,这次就来展开记录servlet的基础知识点
servlet 本体
public class Servlet extends HttpServlet {
public Servlet() {
super();
}
public void destroy() {
super.destroy();
//销毁
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//get请求处理
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//post请求处理
}
public void init() throws ServletException {
//初始化
}
}
servlet 创建时会自动调用4种方法,分别是init()初始化方法、destroy()销毁方法、doGet()doPost()处理客户端的请求
servlet启动过程
servlet 对象
隐式对象 | 说明 | 对象 | 作用域 |
---|---|---|---|
request | 转译后对应HttpServletRequest/ServletRequest对象 | 请求对象 | Request |
response | 转译后对应HttpServletRespons/ServletResponse对象 | 响应对象 | Page |
session | 转译后对应HttpSession对象 | 会话对象 | Session |
application | 转译后对应ServletContext对象 | 应用程序对象 | Application |
out | 转译后对应JspWriter对象,其内部关联一个PrintWriter对象 | 输出对象 | Page |
page | 转译后对应this | 页面对象 | Page |
config | 转译后对应ServletConfig对象 | 配置对象 | Page |
exception | 转译后对应Throwable对象,代表由其他JSP页面抛出的异常对象,只会出现于JSP错误页面(isErrorPage设置为true的JSP页面) | 异常对象 | Page |
pageContext | 转译后对应PageContext对象,它提供了JSP页面资源的封装,并可设置页面范围属性 | 页面上下文对象 | Page |
基本对象之间的关系
作用域
名称 | 说明 | 生命周期 |
---|---|---|
application | 全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享 | 应用程序启动到停止 |
session | 会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态 | 会话超时,或者服务器端强制使会话失效 |
request | 请求作用域 | 客户端的一次请求 |
page | 一个JSP页面 | 页面打开到关闭 |
以上作用范围使越来越小, request和page的生命周期都是短暂的,他们之间的区别就是:一个request可以包含多个page页(include,forward以及filter)。
web.xml
创建jsp项目时的一个基本配置文件,可以配置servlet的名称、映射地址等属性
<!-- servlet注册说明 -->
<servlet>
<!-- servlet说明,可以省略 -->
<description>This is the description of my J2EE component</description>
<!-- servlet在XML编辑器显示的名称 -->
<display-name>This is the display name of my J2EE component</display-name>
<!-- servlet名称 -->
<servlet-name>Servlet</servlet-name>
<!-- servlet类地址 -->
<servlet-class>org.servlet.Servlet</servlet-class>
<!-- servlet启动顺序,0为最早启动,与项目一起启动,数字越大优先级越低,不写就表示被调用时启动 -->
<load-on-startup>0</load-on-startup>
</servlet>
<!-- servlet地址映射 -->
<servlet-mapping>
<!-- servlet名称,与上面保持一致,通过URL地址映射类地址 -->
<servlet-name>Servlet</servlet-name>
<!-- URL逻辑地址 -->
<url-pattern>/servlet/Servlet</url-pattern>
</servlet-mapping>
监听器Listener
域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。
这三个监听器接口分别是
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。
-
attributeAdded 方法
当向被监听对象中增加一个属性时,web容器就调用事件监听器的attributeAdded方法进行响应,这个方法接收一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象
public void attributeAdded(ServletContextAttributeEvent scae) public void attributeAdded(HttpSessionBindingEvent hsbe) public void attributeAdded(ServletRequestAttributeEvent srae)
-
attributeRemoved 方法
当删除被监听对象中的一个属性时,web容器调用事件监听器的attributeRemoved方法进行响应
public void attributeRemoved(ServletContextAttributeEvent scae) public void attributeRemoved(HttpSessionBindingEvent hsbe) public void attributeRemoved(ServletRequestAttributeEvent srae)
-
attributeReplaced 方法
当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的attributeReplaced方法进行响应
public void attributeReplaced(ServletContextAttributeEvent scae) public void attributeReplaced(HttpSessionBindingEvent hsbe) public void attributeReplaced(ServletRequestAttributeEvent srae)
HttpSessionAttributeListener监听器范例:
public class TrolleyListener implements HttpSessionAttributeListener{
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String nameString =event.getName();
if(nameString=="trolley"){
System.out.println("attributeAdded");
}
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String nameString =event.getName();
if(nameString=="trolley"){
System.out.println("attributeRemoved");
}
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String nameString =event.getName();
if(nameString=="trolley"){
System.out.println("attributeReplaced");
}
}
}
web.xml
监听器listener也需要在web.xml中注册才能使用
<listener>
<listener-class>org.listener.TrolleyListener</listener-class>
</listener>
过滤器Filter
过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
- 在客户端的请求访问后端资源之前,拦截这些请求。
- 在服务器的响应发送回客户端之前,处理这些响应。
过滤器重写Filter接口中的doFilter方法实现过滤
编码过滤器范例:
public class EncodingFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
//过滤器销毁
}
//过滤器代码,编码过滤器
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
//过滤器初始化
}
}
web.xml
过滤器Filter也需要在web.xml中注册才能使用
<!-- 过滤器注册 -->
<filter>
<!-- 过滤器名称 -->
<filter-name>encodingFilter</filter-name>
<!-- 过滤器类地址 -->
<filter-class>org.filter.EncodingFilter</filter-class>
</filter>
<!-- 过滤器映射 -->
<filter-mapping>
<!-- 过滤器名称 -->
<filter-name>encodingFilter</filter-name>
<!-- 过滤范围 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
路径
servlet中一般使用逻辑路径<url-pattern>
调用,而在jsp页面中由于<base href="<%=basePath%>">
的作用其基础路径被重定向至项目根目录
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
//basePath默认为http://127.0.0.1:8080/XX/
项目物理路径如下
这就导致*.jsp的逻辑路径为http://127.0.0.1:8080/shopjsp/*.jsp
而servlet为http://127.0.0.1:8080/shopjsp/servlet/*.java
所以在servlet中重定向至jsp页面一般需要返回上一级目录查找。