JavaWeb基础

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的设置

有四种方式如下:

  1. 精确匹配:/user 开头,必须以/开头。当url为http://localhost:8080/webproject/user 时会匹配该Servlet。
  2. 路径匹配:/user/*, 当url为http://localhost:8080/webproject/user/user.html 时会匹配该Servlet。
  3. 拓展名匹配:*.html ,必须以*开头,当url为http://localhost:8080/webproject/user/user.html 或以.html结尾的url都会匹配该Servlet。
  4. 缺省匹配:/ ,只有一个/,当上述方式都失败后会匹配该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级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

生命周期
  1. 与servlet不容filter是在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。
  2. 容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。
  3. 当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。doFilter() 匹配方式不分优先级,只要能匹配路径成功,一定会执行,即使有多个Filter都匹配了路径,也会逐个执行;执行顺序,仅仅与web.xmlfilter-mapping的配置顺序有关!从上至下,逐个执行!
  4. 当应用服务被停止或重新装载了,则会执行Filter的destroy()方法,Filter对象销毁
配置问题

​在filter-mapping中除了可以使用url-pattern 指定过滤目标外,还可以使用servlet-name 两者不冲突。
​在filter-mapping 中有一个dispatcher属性可以指定4种过滤方式

  1. ERROR 发生异常时执行过滤;
  2. FORWARD 转发时执行过滤;
  3. INCLUDE 包含时执行过滤;
  4. 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应用的停止而销毁。当被监视的对象发生情况时,立即采取相应的行动(观察者模式)。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象,通过监听器,可以自动激发一些操作。比如:监听在线用户数量等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值