重生day02

来源:互联网 发布:使命召唤温切斯特数据 编辑:程序博客网 时间:2024/04/29 13:50

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{@Overrideprotected 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就是删除当前的cookiec.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;@Overrideprotected 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;@Overrideprotected 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{@Overrideprotected 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;@Overrideprotected 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");//销毁sessionsession.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
原创粉丝点击