java web基础
Cookie的简单使用
// 包名+类名 javax.servlet.http.Cookie;
// 初始化,为一个键值对,key---value
Cookie ck = new Cookie("username", "icetea");
// 设置cookie在浏览器中存储的时间,参单位 秒s
ck.setMaxAge(60 * 60 * 24 * 7);
// 设置cookie的path,当访问该路径时request会携带这个cookie,“/”表示域名下的所有路径都要携带
ck.setPath("/");
// 将cookie添加到响应中,让服务器响应给浏览器
response.addCookie(ck);
JavaWeb三大基础组件
包括Servlet、Filter、Listener
Servlet
Servlet是运行在服务端的的java程序,是sun公司提供的一套规范。
servlet的生命周期
何时创建: 用户第一次访问Servlet创建Servlet的实例 (单实例),也可以在web.xml中设置<load-on-startup>
参数来设置优先级。
何时销毁: 容器关闭的时候。
JavaEE规范中提供Servlet接口实现类
GenericServlet:通用servlet实现。没有实现service
HttpServlet:与Http协议有关的实现。实现service方法,完成与http协议有关的操作。request.getMethod() 获得请求方式(get、post),将调用doGet(),如果是post,将调用doPost()
url-pattern的设置
有四种方式如下:
- 精确匹配:
/user
开头,必须以/开头。当url为http://localhost:8080/webproject/user
时会匹配该Servlet。 - 路径匹配:
/user/*
, 当url为http://localhost:8080/webproject/user/user.html
时会匹配该Servlet。 - 拓展名匹配:
*.html
,必须以*开头,当url为http://localhost:8080/webproject/user/user.html
或以.html结尾的url都会匹配该Servlet。 - 缺省匹配:
/
,只有一个/,当上述方式都失败后会匹配该servlet
匹配方式优先级:
完全路径匹配 > 目录匹配 > 扩展名匹配>缺省匹配
注意:
1.“/”和“/* ”含义并不相同:“/ * ”属于路径匹配,“/”是缺省匹配,由于路径匹配的优先级高,所以“/*”会覆盖所有的扩展名匹配,很多404错误均由此引起,所以这是一种特别恶劣的匹配模式,一般只用于filter的url-pattern; 2.配置了“/”后,不会拦截以.jsp结尾的url,因为Servlet容器内置了“.jsp”匹配器,而拓展名匹配优先级高,所以会出现该现象。
3.可以阅读http://stackoverflow.com/questions/4140448/difference-between-and-in-servlet-mapping-url-pattern, “/*”和“/”均会拦截静态资源的加载,需要特别注意
Filter
Filter可以对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
生命周期
- 与servlet不容filter是在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。
- 容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。
- 当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。
doFilter()
匹配方式不分优先级,只要能匹配路径成功,一定会执行,即使有多个Filter都匹配了路径,也会逐个执行;执行顺序,仅仅与web.xml
中filter-mapping
的配置顺序有关!从上至下,逐个执行! - 当应用服务被停止或重新装载了,则会执行Filter的
destroy()
方法,Filter对象销毁
配置问题
在filter-mapping
中除了可以使用url-pattern
指定过滤目标外,还可以使用servlet-name
两者不冲突。
在filter-mapping
中有一个dispatcher
属性可以指定4种过滤方式 :
- ERROR 发生异常时执行过滤;
- FORWARD 转发时执行过滤;
- INCLUDE 包含时执行过滤;
- REQUEST 浏览器发送请求时进行过滤,默认。
Filter使用HttpServletRequest的装饰类来对中文乱码进行过滤
filter主要代码如下:
// 判断request的方式
if ("GET".equals(request.getMethod())) {
// 对GET请求的request进行处理
request = new MyRequest(request); // 将request传入装饰类中对其进行装饰
} else {
// 使用setCharacterEncoding进行处理
request.setCharacterEncoding("UTF-8");
}
servlet装饰类代码如下:
// 一个HttpServletRequest的装饰类,解决请求参数乱码的问题,只用来对get请求进行处理
class MyRequest extends HttpServletRequestWrapper {
// 在类中定义一个接口类型的成员变量.用于保存被装饰者对象;
HttpServletRequest request = null;
// 定义有参构造方法,因为父类中没有无参构造
public MyRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
/**
* 加强HttpServletRequest的获取参数方法
*/
@Override
public Map<String, String[]> getParameterMap() {
// 调用request中的方法获取map值
Map<String, String[]> map = request.getParameterMap();
// 遍历map进行,乱码处理
Set<String> keys = map.keySet();
for (String k : keys) {
String[] vs = map.get(k);
// 遍历循环参数值,进行乱码处理
for (int i = 0; i < vs.length; i++) {
try {
String newValue = new String(vs[i].getBytes("ISO8859-1"), "utf-8");
// 覆盖原来的值
vs[i] = newValue;
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
return map;// 传回的是已经处理过乱码的map
}
/**
* 重写单个参数获取方法,并进行乱码处理
*/
@Override
public String getParameter(String name) {
String str = request.getParameter(name);
try {
str = new String(str.getBytes("ISO8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return str;// 传回已经处理过乱码的字符串
}
/**
* 重写多个参数值字符串数组的获取方法,并进行乱码处理
*/
@Override
public String[] getParameterValues(String name) {
String[] strs = request.getParameterValues(name);
// 遍历循环进行乱码处理
for (int i = 0; i < strs.length; i++) {
try {
strs[i] = new String(strs[i].getBytes("ISO8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
return strs;// 传回已经处理过乱码的字符串数组
}
}
Listener
listener是servlet 的监听器。随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。当被监视的对象发生情况时,立即采取相应的行动(观察者模式)。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象,通过监听器,可以自动激发一些操作。比如:监听在线用户数量等等。