Servlet
- Servlet的生命周期:
- JAR使用标注定义的Servlet、监听器、过滤器外有自己的部署描述文件,web-fragment.xml,即每个模块都有。
- web-fragment.xml的根标签配有——也可配于web.xml。
ServletConfig配置:
1.在@WebServlet中使用@WebInitParam标准设置;
2.在web.xml配置初始参数。
ServletContext用途:实现对象来取得所请求资源的URL,设置与储存属性,应用程序初始参数,甚至动态设置Servlet实例。
- 生命周期监听器ServletContextListener,含两个方法:
contextInitialized(ServletContextEvent sce)
/
contextDestroyed(ServletContextEvent sce)
设置为ServletContext属性的共享资料会在Web应用程序存活期间都会一直存在,属性移除方法removeAttribute()。
@WebListener无属性设置,而是在web.xml设置。
在web.xml中设置ServletContextListener实现类
- 改变HttpSession的一些Cookie设置
- web.xml定义;
- ServletContext之后使用getSessionCookieConfig()取得SessionCookieConfig进行设置。
应用场景:在线人数计数显示,可实现HttpSessionListener。
- 容器调用Servlet的service()方法
对客户响应需要覆盖的方法,含两个参数(ServletRequest,ServletResponse)
容器转换HTTP响应步骤:
-
- URL指向一个servlet,想发给这个servlet的容器;
- 判定为Servlet时,创建HttpServletRequest和HttpServletResponse对象;
- 根据URL,从web.xml中找到对应的servlet,创建/分配线程,将HttpServletRequest和HttpServletResponse对象传给线程;
- 根据请求类型调用不同GET或POST方法;
- 把结果填入响应;
- 结束线程,将response对象转换为响应返回给客户,删除对象。(销毁、回收当次请求响应等相关对象)
- POST&GET
使用Get
使用Post
Get会在URL中动态显示传入参数,Post显示固定的URL路径。
public class ThreeParams extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");//说明以下代码为html代码而非纯文本
PrintWriter pw = response.getWriter();
pw.println(request.getParameter("param1"));
pw.println("<br/>");
pw.println(request.getParameter("param2"));
pw.println("<br/>");
pw.println(request.getParameter("param3"));
pw.println("<br/>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.print("post");
doGet(request,response);
}
}
POST请求setCharacterEncoding,对于请求Body中的字符编码有作用,不影响web容器;
GET请求getBytes()指定编码,表达式:String.getBytes(String decode)。
- servlet的调派处理
场景:多个Servlet相互协调未完成响应,要在程序中调派。
具体步骤:
-
- 创建RequestDispatcher dispatcher;
- 初始化dispatcher引用getRequestDispatcher(String path),path要调派的目标路径,即目标Servlet的URL;
- 在需要的地方调用include和forward。
- *server push
- MIME形式——MIME描述消息类型的因特网标准
- 会话管理
隐藏域hidden,对于客户不可见,随表单发送给server,场景将前一页的内容带入后一页。
问题:网页关掉后,仍会遗失。
- Cookie
服务器可以向客户端写内容,只能是文本内容;
客户端可以阻止服务器写入;
只能拿自己webapp写入的东西;
Cookie分为两种属于窗口/子窗口,属于文本;
一个servlet/jsp设置的cookies能够被同一个路径下面或者子路径下面的servlet/jsp读到(路径=URL/!=真实文件路径)。
cookie = new Cookie("user","caterpillar");
cookie.setMaxAge(7*24*60*60);
response.addCookie(cookie);
cookie以键-值对存储
应用场景:用户名免登录,下单订单记录。
写在Client端,如果设置了生存周期,会写在文件中;如没有写,会存在内存中,关闭则无。
通过Ctrl+N新打开另一个页面,会看到有同样的Cookie。
- FilenameFilter文件过滤器
- Session
应用场景:邮箱需要用到Session
Session(SessionId)的两种实现方式:1、URL重写;2、Cookie(临时的和文件的)
- Session的过期时间:
tomcat中web.xml就有Session的过期时间设置;失效方法invalidate();
setMaxInactiveInterval()设定浏览器多久没有请求应用程序的话,HttpSession就自动失效;
在web.xml配置SessionId,存储SessionID的Cookie存活期限。
- Session不像Cookie拥有路径不能访问的问题:
同一个application下的servlet/jsp可以共享同一个session,前提是同一个客户端窗口。
- URL重写
若浏览器不支持Cookie,可通过URL重写的方式实现Session,response.encodeURL(),就是将一些额外追加到表示会话的每个URL末尾,服务器在该标示符与其存储的有关的该会话的数据之间建立关联。适用于重要大项目,其功能有a、转码;b、URL后面带入SessionID。
通过HttpSession来读写Session
如果浏览器支持Cookie,会把SessionID保存在Cookie里,实验中IE浏览器禁不掉Cookie,禁用Cookie后不同页面重新建SessionId。
- Application
- 用于保存整个WebApplication的生命周期内都可以访问的数据
- 在API中表现为servletContext
- 通过ServletContext的get/setAttribute方法取得/设置相关属性
注:不同客户端或者页面共享同一个Session值,位于包中的Servlet,在web.xml中需要配置class时需带包名,在tomcat中的路径也该含有包名路径。
- 向Servlet/context传参
- JavaBean
组件含义:一系列共同对外服务的类。
JavaBean是一种组件,分侠义或广义,侠义的如图形界面;广义理解为Java类。
在Servlet中使用Bean和在通常程序中使用Bean类似,属性名称第一个字母必须小写,一般具有getters and setters,但Bean不应具有GUI表现。
一般是用来实现某一业务逻辑或取得特定结果。
JSP
程序由JSP Engine先将它转换成Servlet代码,如存入apache-tomcat-9.0.41\work\Catalina\localhost\test\org\apache\jsp,接着将它编译成类文件载入执行。
只有当客户端第一次请求JSP时,才需要将其转换、编译。
优点:
- 优良的性能,优于CGI、PHP、ASP
- 平台无关性,操作系统无关,Web服务器无关
- 可扩展性,tag的扩展机制,简化页面开发
- JSTL
- JSF
- JSP部分语法
JSP的脚本片段中带感叹号为成员变量
<%!
int accessCount = 0;
%>
不带感叹号为局部变量
<%
int accessCount = 0;
%>
JSP注释:
<%--...客户端看不到的注释...--%>
<%//... ...%>
<%/*... ...%>
对比Html注释
<!--...客户端看得到的注释...-->
- <%@Directive%>
<%@page language="script language"|
import="importList"|
errorPage="errorPageUrl"|
isErrorPage="true|false"|
contentType="contentTypeInfo"
%>
- action用于运行期间
- useBean
- include:先将代码加载进该页面,属编译期间包含,适用于不传参的场景,即不能向fileURL中传递参数,如不能用于abc.jsp?user=aaa。
- forward
- Directive用于编译期间
- response.sendRedirect与
response.sendRedirect是不同的request,如图中1-1,1-2;
使用同一个request,如图中2-1,2-2,2-3。
- 对象绑定监听器HttpSessionBindingListener
- 对象迁移
- FilterConfig
FilterConfig——类比——>servlet接口init()方法参数上的ServletConfig,
FilterConfig是实现Filter接口的类上使用标注或web.xml中过滤器设置信息的代表对象。
Filter的doFilter()——类比——>Servlet接口的service()
- 响应封装器
- 异步处理
*web容器会为每个请求分配一个线程,异步处理可以先释放容器分配给请求的线程资源。
ServletRequest的startASync()方法获取AsyncContext(带入参/不带入参),可释放容器分配的线程。
@WebFilter和web.xml配置异步处理。