Servlet
当Servlet小于2.5时,需要填写配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>WEB13</display-name>
//配置servlet
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>com.itheima.servlet.QuickStratServlet</servlet-class>
<init-param>
<param-name>url</param-name>
<param-value>aaa</param-value>
</init-param>
//配置servlet在服务器启动时创建对象,优先级取值为[1,5],数字越小越高
//Servlet默认第一次访问Servlet时创建
<load-on-startup>3</load-on-startup>
</servlet>
//配置映射
<servlet-mapping>
<servlet-name>abc</servlet-name>
//1完全匹配
<url-pattern>/quickStratServlet</url-pattern>
//2目录匹配 代表访问a目录下的b的任意资源
<url-pattern>/a/b/*</url-pattern>
//3扩展名匹配 代表访问任意以aaa为后缀的文件
<url-pattern>*.aaa</url-pattern>
//注意2和3不要混用
//缺省的servlet,当所有的资源请求都没有匹配时,使用缺省servlet
<url-pattern>/</url-pattern>
//注意:使用缺省会无法正常访问普通的静态资源,因为项目的缺省映射将Tomcat的全局缺省映射覆盖了,而所有静态资源输出都是又Tomcat的缺省servlet做的,所有的响应都是由servlet负责,包括静态资源。
</servlet-mapping>
//默认打开网页格式
<welcome-file-list>
<welcome-file>1.html</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
创建Servlet实例
//实现Servlet
public class QuickStratServlet implements Servlet{
//Servlet默认第一次访问Servlet时创建
@Override
public void init(ServletConfig config) throws ServletException {
//ServletConfig config 是 servlet 的配置信息
//1、获得servlet的name----<servlet-name>abc</servlet-name>
String servletName = config.getServletName();
System.out.println(servletName);//abc
//2、获得该servlet的初始化的参数(来源于配置文件)
String initParameter = config.getInitParameter("url");
System.out.println(initParameter);
//3、获得Servletcontext对象
ServletContext servletContext = config.getServletContext();
System.out.println("init running....");
}
//每次请求都会经过此方法
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("QuickStratServlet running....");
res.getWriter().write("QuickStratServlet running....");
}
//服务器关闭Servlet销毁的时候会执行
@Override
public void destroy() {
System.out.println("destroy running....");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
}
域对象
概念
存储数据区域及是域对象,类似于一个全局的仓库,给web资源共享数据使用
ServletContext
概念
代表当前web应用的环境上下文对象,ServletContext对象内部封装是该web应用的信息,一个web应用只存在一个ServletContext对象。
域对象固有方法
void setAttribute(String key,Object value);//存入数据
Object value = getAttribute(String key);//取出数据
removeAttribute(String key);//移除数据
生命周期
创建:当前web应用被加载(服务器启动或发布web应用)
销毁:web应用被卸载(服务器关闭,移除该web应用)
-
获取
//Servlet子类中 this.getServletContext(); //init(ServletConfig config) config.getServletContext();
-
使用
1. 获取web应用全局初始化参数
- 配置
//web.xml配置,在<web-app>根节点下
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
- 获取
ServletContext context = getServletContext();
String initParameter = context.getInitParameter("driver");
2. 获取web应用中任何资源的绝对路径
//通过相对地址 (web项目相对地址) 获取绝对路径
String path = getRealPaht(String path);
//通过类加载器来通过相对地址 (class相对地址) 来获取绝对路径
String path = ContextServlet.class.getClassLoder().getResource(String path).getPath();
getMimeType(String filename);//根据文件名自动判断类型并返回
3. 域对象
> ServletContext域对象的作用范围:整个web应用中所有的web资源
> (servlet,jsp..)都可以随意向ServletContext存取数据,达成数据共享。
void setAttribute(String key,Object value);//存入数据
Object value = getAttribute(String key);//取出数据
removeAttribute(String key);//移除数据
HttpServletResponse
页面响应对象,用于写页面
使用
setStatus(int statusCode);//设置状态码
addHeader(String name,String value);//增加响应头
addIntHeader(String name,int value);//一般用于设置数据长度
addDateHeader(String name,long date);//一般用于设置时间
setHeader(String name,String value);
setDateHeader(String name,long date);
setIntHeader(String name,int value);
//重定向
setStatus(302);
setHeader("Location","/WEB14/servlet2");
//重定向简写
sendRedirect(String url);
//定时刷新,延时5秒重定向到百度
setHeader("refresh","5;url=http://www.baidu.com");
setCharacterEncoding("UTF-8");//设置编码,此方法必须在getWriter前使用才有效
setHeader("Content-Type","text/html;charset=UTF-8");//设置浏览器使用UTF-8来解析,同时此方法包含setCharacterEncoding,也会对输出设置编码
setContentType("text/html,charset=UTF-8");//同上,快捷写法
PrintWriter getWriter();//获取字符输出流
getOutputStream();//获取字节输出流,不能与getWriter()同时出现否则会报错
setHeader("Content-Disposition","attachment;filename="+filename);//下载的文件名
HttpServletRequest
网页请求对象,用于获取请求信息
使用
String getMethod();//获取请求协议
String getRequestURI();//获取请求资源地址(相对)
String getRequestURL();//获取网络请求地址
String getContextPath();//获取web应用名称
String getQueryString();//get提交的参数字符串
String getRomoteAddr();//获得客户端的ip地址
long getDateHeader(String name);//获取时间请求头
String getHeader(String name);//获取请求头
Enumeration getHeaderNames();//获取请求头名字的枚举
Enumeration getHeaders(String name);//获取请求头中值的枚举
int getIntHeader(String name);
String getParameter(String name);//获取参数
String[] getParameterValues(String name);//获取多个参数
Enumeration getParameterNames();//获取所有参数名枚举
Map<String,String[]> getParameterMap();//获取参数键值对
//转发
RequestDispatcher getRequestDispatcher(String path);//获得一个请求转发器
forward(ServletRequest request,ServletResponse response)
参数出现乱码
原因:post参数是保存在流内而get参数保存在地址,所以Post设置setCharacterEncoding即可将流内参数编码设置好,而get只能通过将iso8859-1转换为utf-8来解决
//如果是Post参数出现乱码设置request编码即可
request.setCharacterEncoding("UTF-8");
//如果是get参数出现乱码,也适用于Post
new String(username.getBytes("iso8859-1"),"UTF-8");
Cookie
客户端会话空间,一次会话(打开浏览器访问,到关闭浏览器)产生一个,Cookie仅能存非中文字符串
Cookie cookie = new Cookie(String cookieName,String cookieValue)
response.addCookie(Cookie cookie);
如果不携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
setPath(String path);//设置Cookie携带路径
持久化,如果不设置持久化时间,cookie会存储在浏览器内存中,浏览器关闭cookie信息销毁,如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里
setMaxAge(int seconds);//设置持久化时间
获取cookie
Cookie[] cookies = request.getCookies();//通过request获取所有cookie
if(cookies!=null){
for(Cookie coo : cookies){
coo.getName();//通过遍历获取Cookie的key
coo.getValue();//通过遍历获取Cookie的value
}
}
Session
服务器会话空间,一次会话(打开浏览器访问,到关闭浏览器)产生一个。
此技术是基于cookie,cookie储存了session编号---JSESSIONID
HttpSession session = request.getSession();//获取当前会话的session对象,服务器不存在该session则创建,存在则获取
String getId();//获取JSESSIONID
//域对象固有方法传递共享数据
void setAttribute(String key,Object value);//存入数据
Object value = getAttribute(String key);//取出数据
removeAttribute(String key);//移除数据
生命周期
-
创建:第一次执行request.getSession()时创建
-
销毁:
-
服务器(非正常)关闭
-
session过期/失效(默认不操作服务端资源后30分钟)
可以在工程的web.xml进行配置
<session-config> <session-tiomeout>30</session-timeout> </session-config>
-
手动销毁
session.invalidate();
-
持久化
将JSESSIONID的cookie持久化
网友评论