学习笔记--Servlet技术
-------------------------------------------------------------------------------------------------------------------------------------
//Servlet概述一个servlet就是一个java类,并提供基于请求-响应模式的web服务。
//创建Servlet
新建继承HttpServlet的类,覆盖init(), destroy(), service(HttpServletRequest req, HttpServletResponse res), doGet(HttpServletRequest req, HttpServletResponse res)方法
//配置Servlet
在web.xml中servlet项加入<init-param>项,如:
<servlet>
<init-param>
<param-name>data1</param-name>
<param-value>value1</param-value>
</init-param>
<init-param>
<param-name>data2</param-name>
<param-value>value2</param-value>
</init-param>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.netease.server.example.web.controller.TestServlet</servlet-class>
</servlet>
代码中相应方法:
ServletConfig config = this.getServletConfig();
String v1 = config.getInitParameter("data1"); 全局配置:
在servlet项外加入<context-param>项,如:
<context-param>
<param-name>globalData1</param-name>
<param-value>123</param-value>
</context-param>
代码中相应方法:
ServletContext context = this.getServletContext();
String globalV1 = context.getInitParameter("globalData1"); ServletMapping匹配规则:
<url-pattern>支持模糊匹配
精确路径匹配(完全匹配)---> 最长路径匹配(最长前缀匹配)---> 扩展名匹配 ---> default servlet或放弃
更改servlet默认启动时间:
在<servlet>元素中增加<load-on-startup>元素,负数为第一次请求时启动该servlet,大于等于0则在servlet容器启动时启动servlet,数字越小,优先级越高,如:
<load-on-startup>0</load-on-startup>
配置错误页面:
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
配置欢迎页面:
<welcom-file-list>元素,可包含多个<welcom-file>元素,顺序加载
MIME类型映射
<mime-mapping>定义扩展文件名映射类型,包含两个子元素:<extension>和<mime-type>
//Servelt共享动态属性
一个servlet代码中:
ServletContext context = this.getServletContext();
context.setAttribute("attribute1", "123");
另一个servlet代码中:
String globalV1 = (String)context.getAttribute("attribute1");
//Servlet读取外部资源配置文件信息
三种方法:
1. getResource
代码如:
ServletContext context = this.getServletContext();
URL url = context.getResource("/WEB-INF/log4j.properties");
InputStream in = url.openStream();
String propertyValue = GeneralUtil.getPropery("log4j.rootCategory", in); 2. getResourceAsStream
代码如:
InputStream in2 = context.getResourceAsStream("/WEB-INF/log4j.properties");
String p2 = GeneralUtil.getPropery("log4j.rootCategory", in2); 3. getRealPath
代码如:
String path = context.getRealPath("/WEB-INF/log4j.properties");
File file = new File(path);
InputStream in3 = new FileInputStream(file);
String p3 = GeneralUtil.getPropery("log4j.rootCategory", in3); //HttpServletRequest实现类方法:
1. 获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
getServerPath()获取请求的文件的路径
2. 获得客户机请求头
getHeader(string name)方法
getHeaders(String name)方法
getHeaderNames方法
3. 获得客户机请求参数(客户端提交的数据)
getParameter(name)方法 获取请求中的参数,该参数是由name指定的
getParameterValues(String name)方法 获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。
getParameterNames方法 返回一个包含请求消息中的所有参数名的Enumeration对象。通过遍历这个Enumeration对象,就可以获取请求消息中所有的参数名。
getCharacterEncoding() 返回请求的字符编码方式
getAttributeNames()返回当前请求的所有属性的名字集合赋值:setAttribute()
getAttribute(String name) 返回name指定的属性值
getsession()返回和客户端相关的session,如果没有给客户端分配session,则返回null
getParameterMap():返回一个保存了请求消息中的所有参数名和值的Map对象。Map对象的key是字符串类型的参数名,value是这个参数所对应的Object类型的值数组
addHeader(String name,String value) 将指定的名字和值加入到响应的头信息中
//HttpServletResponse实现类方法:
encodeURL(String url) 编码指定的URL
sendError(int sc) 使用指定状态码发送一个错误到客户端
setDateHeader(String name,long date) 将给出的名字和日期设置响应的头部
setHeader(String name,String value) 将给出的名字和值设置响应的头部
setStatus(int sc) 给当前响应设置状态码
setContentType(String ContentType) 设置响应的MIME类型 ,页面的设置文本类型,获取或设置输出流的 HTTP MIME 类型。输出流的 HTTP MIME 类型。默认值为“text/html”
getOutputStream() 字节输出流对象
getWriter() 字符的输出流对象
//Cookie和Session
关于Cookie
cookie数量限制:20个,每个大小限制:4kb
Cookie userNameCookie = new Cookie("userName", userName); //创建cookie
userNameCookie.setMaxAge(10 * 60); //设置cookie有效时间
response.addCookie(userNameCookie); //在响应中加入cookie
Cookie[] cookies = request.getCookies(); //从请求中获取cookie
cookie.getValue(); //从cookie中获取值
cookie.getName(); //从cookie中获取名字
关于Session
默认有效期30分钟,setMaxInactiveInterval设置有效期,invalidate使session失效
HttpSession session = request.getSession();
String name = (String) session.getAttribute("userName"); session.setAttribute("userName", userName);
session.invalidate();
在部署描述符web.xml中配置有效期:
<session-config>
<session-timeout>5</session-timeout>
</session-config>
//请求转发与重定向
请求转发:
获取RequestDispatcher:
方法1:
RequestDispatcher rd = req.getRequestDispatcher("/forwardExample"); //可以是绝对路径或者相对路径
方法2:
RequestDispatcher rd = this.getServletContext().getNameDispatcher("ServletForwardExample"); //转发到的servlet名称
或者
RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/forwardExample"); //只能是绝对路径
转发:
rd.forward(req, resp);
请求重定向:
resp.sendRedirect("redirectExample"); //相对路径则访问本web,绝对路径可以访问其他web
//过滤器与监听器
启动顺序:ServletContext--->listener--->filter--->servlet
过滤器:
创建实现Filter接口的类作为过滤器,在web.xml中增加<filter>项和<filter-mapping>,可定义多个<filter>,可配置FilterConfig,如下:
<filter>
<init-param>
<param-name>filterParam</param-name>
<param-value>111</param-value>
</init-param>
<filter-name>TestFilter</filter-name>
<filter-class>com.netease.server.example.web.controller.filter.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/hello/world/*</url-pattern>
</filter-mapping>
代码中:
String value = filterConfig.getInitParameter("filterParam");
在doFilter方法中可对request进行处理,如:
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("filter doFilter method");
HttpServletRequest req = (HttpServletRequest) request;
HttpSession session = req.getSession();
if (session.getAttribute("username") == null) {
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect("../index.html");
} else {
chain.doFilter(request, response);
}
}监听器:
分类
1. 监听应用程序环境 ServletContext
ServletContextListener
ServletContextAttributeListener
2. 监听用户请求对象 ServletRequest
ServletRequestListener
ServletRequestAttributeListener
3. 监听用户会话对象 HttpSession
HttpSessionListener
HttpSessionAttributeListener
HttpSessionActivationListener
HttpSessionBindingListener
创建实现相关接口的类,如实现HttpSessionAttributeListener,ServletContextListener, ServletRequestListener接口的类
在web.xml中增加<listener>项:
<listener>
<listener-class>com.netease.server.example.web.controller.listener.TestListener</listener-class>
</listener>
//Servlet并发处理
特征:单实例,多线程,线程不安全
变量的线程安全:
--参数变量本地化
--使用同步块synchronized
属性的线程安全:
--SerletContext线程不安全
--HttpSession理论上线程安全
--ServletRequest线程安全
避免在Servlet中创建线程
多个Servlet访问外部对象加锁
在代码中加入
synchronized (this) {
...
}
//JSP
动态网页技术标准
简化的servlet
JSP = Html + Java + JSP tag
JSP处理流程:
客户端--->发送JSP请求--->JSP文件--->转换为Servlet文件--->编译为class文件--->执行并载入servlet实例--->返回响应到客户端
JSP基本语法:
1. 静态内容
模板数据
2. 指令
page指令
--定义页面的依赖属性,比如脚本语言、error页面、缓存需求等
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
include指令--包含其他文件
<%@include file="../include/admin/adminHeader.jsp"%>
taglib指令
--引入标签库的定义
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
3. 注释
<%-- 注释 --%>
4. 表达式
<%= 表达式 %>
如下:
<p> Today's date: <%= (new java.util.Date()).toLocaleString() %> </p>
5. 声明
<%! declaration; [declaration; ] + ... %>
如:<%! int a, b, c; %>
6. 脚本
<% 代码片段 %>
如下:
<% out.println("Your IP address is : " + request.getRemoteAddr()); %>
JSP内置对象
request HttpServletRequest类的实例
response HttpServletResponse类的实例
out PrintWriter类的实例,用于把结果输出至网页上
session HttpSession类的实例
applicaiton ServletContext类的实例,与应用上下文有关
config ServletConfig类的实例
page 类似于Java中的this关键字
pageContext PageContext类的实例,提供对JSP页面的所有对象以及所有命名空间的访问
Exception Exception类的对象,代表发生错误的JSP页面对应的异常对象
常用标签库标签:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
遍历集合
<c:forEach items="${thecs}" var="c">
条件判断
<c:if test="${!page.hasPreviouse}">class="disabled"</c:if>