浏览 1232 次
锁定老帖子 主题:servlet学习
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2015-11-15
日期 重点 备注 2015-11-07 Http: 传输 Url: 定位 Html:展示 1.0 Http原理 Hyper Text Transfer Protocol 超文本传输协议 (无状态协议:本次和下次请求没有关系, cookie[客户端], session[服务器端]) 浏览器和服务器信息交互过程: 建立连接 发送请求信息 回送响应信息 关闭连接 Http 1.1 支持持续连接 请求行 请求头 实体内容 2.0 第一个Servlet程序 Java代码: package com.bjsxt.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FirstServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { System.out.println("First Servlet"); } } web.xml配置: <servlet> <servlet-name>firstServlet</servlet-name> <servlet-class>com.bjsxt.servlet.FirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>firstServlet</servlet-name> <url-pattern>/111</url-pattern> <url-pattern>/oneone</url-pattern> </servlet-mapping> 访问路径:http://localhost:8080/111 url-pattern匹配格式 <url-pattern>/111/*</url-pattern> --匹配/111下的所有请求 <url-pattern>/111</url-pattern> --匹配/111的请求 <url-pattern>*.111</url-pattern> --匹配以.111结尾的请求 除了以*开头的匹配模式外, 其他的都要加斜杠。 3.0 项目配置自启动 在tomcat web.xml文件内,<Host>标签内配置: <Context path=”uuu” docBase=” E:\workspace\servlet\WebRoot” reloadable=”true” /> 这样当tomcat启动时,自动启动该项目 4.0 servlet生命周期 init() (第一次运行servlet的时候执行(也可以在启动时加载[<load-on-startup>]),一个servlet只初始化一次,所以是单例模式,多个线程共享一个对象,要注意变量的定义位置,在service方法外的变量为共享变量,会发生资源冲突) service() :每个线程调用一次 destroy() :服务器关闭的时候自动调用 由service()方法调用doGet,doPost方法。 每个线程都会去调用对应的service()方法,然后调用super.service(arg0, arg1); 再由父类去调用对应的doPost,doGet方法。 5.0 HttpServletRequst对象的使用 获取头信息: Enumeration e = req.getHeaderNames(); System.out.println("获取请求头信息"); while(e.hasMoreElements()){ String temp=(String)e.nextElement(); System.out.println(temp + "--"+req.getHeader(temp)); } 获取请求头信息 accept--image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* referer--http://localhost:8080/servlet/2.jsp accept-language--zh-CN content-type--application/x-www-form-urlencoded accept-encoding--gzip, deflate user-agent--Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2) host--localhost:8080 content-length--24 connection--Keep-Alive cache-control--no-cache cookie--JSESSIONID=FFEB7FA2BD1D3DD125D161AC13DB8E63 System.out.println("获取参数信息:"); String[] aihaos=req.getParameterValues("aihao"); //用于获取多个值的参数,如复选框的值 for (String s:aihaos) { System.out.println(s); } System.out.println("req.getContentType="+req.getContentType()); System.out.println("获取协议信息:"+req.getScheme()); System.out.println("获取URI:"+req.getRequestURI()); System.out.println("获取URL:"+req.getRequestURL()); System.out.println("获取协议:"+req.getProtocol()); System.out.println("获取客户端的IP:"+req.getRemoteHost()); System.out.println("客户端的端口:"+req.getRemotePort()); System.out.println("获取服务器端的IP:"+req.getLocalAddr()); System.out.println("获取服务器端的端口:"+req.getLocalPort()); System.out.println("参数:"+req.getQueryString()); System.out.println("参数:"+req.getParameter("name2")); System.out.println("获取项目路径:"+req.getContextPath()); 获取参数信息: 1 2 req.getContentType=application/x-www-form-urlencoded 获取协议信息:http 获取URI:/servlet/testGetPost 获取URL:http://localhost:8080/servlet/testGetPost 获取协议:HTTP/1.1 获取客户端的IP:127.0.0.1 客户端的端口:50907 获取服务器端的IP:127.0.0.1 获取服务器端的端口:8080 参数:null 参数:44 获取项目路径:/servlet 6.0 HttpSerletResponse对象的使用 构建响应头: response.setHead(); 构建响应体: response.getWrite(); //用于文本输出 response.getOutputStream(); //用于下载 PrintWriter pw1= resp.getWriter(); PrintWriter pw2= resp.getWriter(); System.out.println("两次获得的pw是否是同一个对象, pw1是否等于pw2:"+(pw1==pw2)); resp.setHeader("content-type", "text/html;charset=gbk"); resp.setContentType("text/html;charset=gbk"); // text/xml :xml格式 /text/plain :普通文本 /text/html:html格式 resp.setCharacterEncoding("gbk"); //这三种写法都可以设置编码 两次获得的pw是否是同一个对象, pw1是否等于pw2:true 7.0 转发和重定向 //重定向 resp.sendRedirect("2.jsp"); //重定向 返回码:302 //转发 req.getRequestDispatcher("2.jsp").forward(req, resp); 8.0 Path “/” 总结 只要是需要通过浏览器发送请求的地方(比如HTML代码:sendRedirect()方法等),“/”一般代表虚拟主机的目录,即相当于端口之后的“/”. 服务器程序内部跳转,“/”一般代表web应用的根目录。 9.0 Session和Cookie 1.0 Session 的基本用法: session的两种实现方式:cookie和URL 。 通过HttpSession来读写session Session创建规则: 如果cookie允许创建session,则sessionId会保存在cookie中。 如果不支持cookie,需要自己编程使用RUL重写的方式实现Session response.encodeURL() 这个方法有两个作用: 一是转码 二是:URL后面加入sessionId protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session=req.getSession(); //获得session session.setMaxInactiveInterval(0); //设置失效时间, 负值为永不失效, 0为立即失效 单位为妙 session.invalidate(); //强制失效 System.out.println(session.getId()); //获取SessionId } 2.0 Cookie的基本用法: 1.0服务器可以向客户端写内容 2.0 只能是文本内容 3.0 客户端可以阻止服务器写入 4.0 只能拿自己的webapp写入的东西 5.0 Cookie分为两种: 属于窗口/子窗口 属于文本 6.0 一个servlet/jsp设置的cookies能够被同一个路径下面或者子路径下面的servlet/jsp读到(路径=URL,并非真实的文件路径) 设置: import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 设置cookie * @author hadoop * */ public class SetCookiesServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { for(int i=0;i<3;i++){ Cookie cookie=new Cookie("Session-Cookie-"+i, "Cookie-Value-S"+i); cookie.setMaxAge(0); resp.addCookie(cookie); cookie=new Cookie("Persisten-Cookie-"+i,"Cookie-Value-P"+i); cookie.setMaxAge(3600); //设置有效时间为1个小时 resp.addCookie(cookie); } resp.setContentType("text/html;charset=gb2312"); PrintWriter out=resp.getWriter(); String title="Setting Cookies"; out.println("<html><head><title>设置Cookie</title></head>" + "<body><A HREF=\"showCookie\"><CODE>showCookies</CODE>servlet</A></body></html>"); } } 读取: import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 获取cookie的值 * @author hadoop * */ public class ShowCookieServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies= req.getCookies(); resp.setContentType("text/html;charset=gb2312"); PrintWriter out=resp.getWriter(); String title="Active Cookies"; out.println("<html><head><title>获取客户端Cookie</title></head><body><table><tr>" + "<th>Name</th><th>Value</th></tr>"); for(Cookie cookie:cookies){ System.out.println("Path="+cookie.getPath()); out.print("<tr><td>"+cookie.getName()+"</td><td>"+cookie.getValue()+"</td></tr>"); } out.println("</table></body></html>"); } } 10.0 Application 作用: 1.0用于保存整个WebApplication的生命周期内都可以访问的数据 2.0 在API中表现为ServletContext 3.0 通过HttpServlet的getServletContext()方法可以拿到 4.0 通过ServletContext的get/setAttribute方法取得/设置相关属性 例子: package com.bjsxt.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * ServletContext测试 * @author hadoop * */ public class TestServletContextServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext= this.getServletContext(); //获取ServletContext Object acount=servletContext.getAttribute("acceAcount"); if(acount==null){ servletContext.setAttribute("acceAcount", 0); }else { servletContext.setAttribute("acceAcount", Integer.parseInt(servletContext.getAttribute("acceAcount").toString())+1); } PrintWriter out=resp.getWriter(); out.print(servletContext.getAttribute("acceAcount").toString() + "==="+this.getServletName()); } } 于 磨刀坑.永泰.白云区.广州 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |