重生day02

web.xml映射细节,注解来配置Servlet,load-on-startup就是和服务器一起启动的,Servlet的线程安全问题,cookie的使用,cookie使用中文和修改里面的值,cookie的持久化,删除cookie,cookie缺陷带来的跨域和domain设置,session的使用和等等技术

1.可以有多个url-pattern,

2.一个Servlet可以配置多个servlet-mapping,

3.url-pattern必须保证唯一并且带/

4.Servlet支持通配符*

① /*    任意资源都可以访问      /system/*   必须带有system才能访问

        ②*.do   请求资源必须带有.do

5.映射的时候servlet-name中不能有default,因为在tomcat中的web.xml存在着一个default,专门处理静态资源(html,js,css,图片等),从这里可以看出自己创建的Serlvet的web.xml是覆盖tomcat的web.xml的(覆盖的话使用就近原则,没覆盖的还是调用的tomcat的web.xml)


Servlet3.0对应着javaee6,也就是tomcat7.*

metadata-complete="false"

上述两个是必须条件,调试的过程中忽略了一个问题,init是只初始化一次的,所有name和value只能取一次在init方法中

@WebServlet(value = "/m222", initParams = {
		@WebInitParam(name = "encoding",value = "UTF-8"),
		@WebInitParam(name = "wqy",value = "18") })
public class HttpServletRequestTest extends HttpServlet {


因为servlet是单例的,servlet的成员变量只有一份,多个客户端好比是多个线程,都访问的是同一个空间

解决办法:1.让当前的servlet实现avax.servlet.SingleThreadModel接口. 但是此方法很耗性能,并且已经过时。

            2.在Servelt中不要使用成员变量,而是局部变量,每一个用户,每一个请求都会调用service方法,而局部变量在service方法中,每一次都是新的空间.

补充知识:Struts1,Spring MVC都是线程不安全的,都是单例的和Servlet类似.           Struts2是线程安全的,因为每一个线程(请求)都是一个新的Action对象.

具体看代码,不管如何只要设置了cookie就得重新给response添加进去。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="../cookie/login" method="post">
<table>
  <tr>
    <td>用户名</td>
    <td><input type="text" name="username" /></td>
  </tr>
  <tr>
    <td>密码</td>
    <td><input type="password" name="password" /></td>
  </tr>
  <tr>
    <td><input type="submit" value="提交" /></td>
    <td></td>
  </tr>
</table>
</form>
</body>
</html>
package day02;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/cookie/login")
public class LoginServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest requ, HttpServletResponse resp)
			throws ServletException, IOException {
		requ.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		String username = requ.getParameter("username");
		String res = URLEncoder.encode(username,"utf-8");
		Cookie c = new Cookie("currentName",res);
		
		//修改cookie的值
			//c=new Cookie("currentName","xx");
		//cookie的持久化(可以指定持久时间)和会话(表示关闭浏览器就没了) 单位是秒
		//这里如果是0就是删除当前的cookie
		c.setMaxAge(15);
		
		//resp.addCookie(c);
		
		//第二种修改cookie的值,二种修改都需要重新addCookie
		//c.setValue("yy");
		
		resp.addCookie(c);
		
		
		out.println("欢迎"+URLDecoder.decode(res, "utf-8")+"<br/>");
		out.println("<a href='/cookie/list'>收件箱</a>");
	}
	
}
package day02;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/cookie/list")
public class ListServlet extends HttpServlet{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String username = "";
		
		Cookie[] cs = request.getCookies();
		for (Cookie cookie : cs) {
			String name = cookie.getName();
			String value = cookie.getValue();
			if("currentName".equals(name)){
				username = URLDecoder.decode(value,"UTF-8");
			}
		}
		
		out.println("欢迎"+username+"<br/>");
		for(int i=0;i<6;i++){
			out.println("<a href='/cookie/get'>一份邮件</a>");
		}
	}
	
}
package day02;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/cookie/get")
public class GetServlet extends HttpServlet{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String username="";
		
		Cookie[] cs = request.getCookies();
		for (Cookie cookie : cs) {
			String name = cookie.getName();
			String value = cookie.getValue();
			if("currentName".equals(name)){
				username = URLDecoder.decode(value,"UTF-8");
			}
		}
		
		out.println("欢迎"+username+",你要请龙哥吃饭!");
	}
	
}

不同目录下的cookie不能传输,需要设置参数。

cookie.setPath("/');
//遇到二级域名的时候
cookie.setDomain(".baidu.com");

session的简单使用

package day02.session;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/session/login")
public class LoginServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest requ, HttpServletResponse resp)
			throws ServletException, IOException {
		requ.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		String username = requ.getParameter("username");
	
		HttpSession session = requ.getSession();
		session.setAttribute("currentName", username);
		
		
		out.println("欢迎"+username+"<br/>");
		out.println("<a href='/session/list'>收件箱</a>");
	}
	
}
package day02.session;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/session/list")
public class ListServlet extends HttpServlet{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String username ="";
		
		HttpSession session = request.getSession();
		username = (String) session.getAttribute("currentName");
		
		
		out.println("欢迎"+username+"<br/>");
		for(int i=0;i<6;i++){
			out.println("<a href='/session/get'>一份邮件</a>");
		}
	}
	
}

session的规范

设置session的时候起名 USER_IN_SESSION,

对于多个参数的session不可能创建多个session,可以使用封装思想,创建个User类,里面存有用户名和密码等信息,设置get、set方法,在创建session的时候存储在本类中,另外本类需要实现接口java.io.Serializable(网络传输)

session的删除

//删除session指定的属性值
session.removeAttribute("currentName");
//销毁session
session.invalidate();

session的超时管理,缺省值是30分钟

session.setMaxInactiveInterval(60*10);//十分钟后超时,销毁session


URL重写:针对禁用cookie时使用的方法。

/session/list;jsessionid=872870F9466CE7B3A11FD3B768FDD684   session.getId();

等价于String url = response.encodeURL("/session/list"); 

开发中不会禁用cookie




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值