Servlect的注册.
<!-- 注册oneServlet --> <!-- 第一部分 注册OneServlet--> <servlet> <!-- srvlet 增加名字 --> <servlet-name>OneServlet</servlet-name> <!--注册servlet地址 --> <servlet-class>com.servlet.OneServlet</servlet-class> <load-on-startup>4</load-on-startup> </servlet> <!--第二部分 :设置一个浏览器可以访问的servlet的地址 --> <servlet-mapping> <servlet-name>OneServlet</servlet-name> <!--设置浏览器地址 --> <url-pattern>/a</url-pattern> <!-- 设置地址访问一定加/asd --> </servlet-mapping>
Servlect三种方式.
public class OneServlet implements Servlet {}
public class TwoServlet extends GenericServlet {}
public class ThreeServlet extends HttpServlet{}
Servlect对象@1ServletConfig静态数据
第一种方式:在web.xml中获得静态数据。
<welcome-file>B.jsp</welcome-file> <servlet> <servlet-name>Servlet1</servlet-name> <servlet-class>com.Servlet.Servlet1</servlet-class> <!-- 注意<init-param>写在里面 --> <init-param> <param-name>home</param-name> <param-value>二家酒店</param-value> </init-param> <init-param> <param-name>money</param-name> <param-value>200万</param-value> </init-param> <init-param> <param-name>h</param-name> <param-value>173cm</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Servlet1</servlet-name> <!--设置浏览器地址 --> <url-pattern>/S</url-pattern> <!-- 设置地址访问一定加/asd --> </servlet-mapping>
获取方式
String a=config.getInitParameter("home"); String b=config.getInitParameter("money"); String c=config.getInitParameter("h"); System.out.println(a+"==========="+b+"899"+c); //如果有多个静态数据,为避免执行重复的代码 //获得 //迭代 Enumeration<String> e=config.getInitParameterNames(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); //home money String value =config.getInitParameter(key); //值一 System.out.println(key+"@@@@"+value);
第二种方式:在Servlect中获得静态数据。
@WebServlet(urlPatterns = "/Servlet2",initParams = { @WebInitParam(name="aaaa",value="张三"), @WebInitParam(name="age",value="23"), @WebInitParam(name="height",value="179cm"), @WebInitParam(name="weight",value="60kg") })
获取方式
ServletConfig config=getServletConfig(); String a=config.getInitParameter("aaaa"); String b=config.getInitParameter("age"); String c=config.getInitParameter("height"); String e=config.getInitParameter("weight"); System.out.println(a+"===="+b+"#######"+c+"-----"+e);
Servlect对象二@ServletContext.共享动态数据,文件数据,静态数据。
第一个作用 静态数据在web.xml文件中
<!-- 每一个servlet自己静态数据<init-param>--> <context-param> <param-name>lq</param-name> <param-value>篮球</param-value> </context-param> <context-param> <param-name>zq</param-name> <param-value>足球</param-value> </context-param>
获取方式
//1获取ServletContext对象 ServletContext sc=getServletContext(); //获取web.xml文件中的镜头数据 String a=sc.getInitParameter("zq"); //给浏览器发送数据 response.getWriter().append("Servlet2获得静态数据用来访问zq:"+a);
第二个作用 动态数据在Servlect.
//response.setContentType("text/html"); response.setContentType("text/html"); //设置发送给浏览器文本utf-8 //response.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); //因为浏览器是使用get请求 //所以Servlet do-get //servlet1相打篮球 //1获取ServletContext对象 ServletContext sc=getServletContext(); //获取web.xml文件中的镜头数据 String a=sc.getInitParameter("lq"); //给浏览器发送数据 response.getWriter().append("Servlet3获得静态数据用来访问lq:"+a);
第三个作用文件数据
response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); // 获得text.txt完整路径 ServletContext sc=getServletContext(); //指定文件名称获取完整路径 String path=sc.getRealPath("text.txt"); //控制台打印输出文件完整路径 System.out.println(path); //将text.txt读取出来 //IO inputStream /outputStream输出流。 //网上下载的图片以自己为主场输入 //总结:始终以自己为主场,观察数据流向。 /* InputStream is=sc.getResourceAsStream("/text.txt"); */ InputStream is=sc.getResourceAsStream("/text.txt"); //分析:1.假设text.txt是一部一百万的小说 //当读取大量数据的时候,采取分段读取,部分读取 //一般情况下,一次读取1024字节byte=1kb 512个字 byte[] bytes=new byte[1024]; //分析:2.数据非常少的时候 //定义一个变量,用于记录每一次读取的字节数 //判断记录的字节数是否小于1024,表示快读取结束 int count=-1;//-1标记为读取结束 //定义一个字符串用于汇总每次读取的部分字符串内容 String sum=""; //循环读取 while ((count=is.read(bytes))!=-1) { //需要将每一次读取的字节数组转换成字符串 String s=new String(bytes, 0, count); sum+=s; } System.out.println(sum); //response.getWriter().append("Served at: ").append(request.getContextPath()); response.getWriter().append("Servlet1获得静态数据用来访问lq:"); response.getWriter().append("response.getWriter().append方法打印内容"); response.getWriter().append("Servlet1获得静态数据用来访问pq:");
Servlect对象三Response对象
//设置servlet发送的数据支撑HTML格式 response.setContentType("text/html"); //设置发送servlet 浏览html格式 utf-8 response.setCharacterEncoding("UTF-8"); String info="abc"; PrintWriter pw=response.getWriter(); pw.print(info);
图片的下载
// 使用对象完成图片的下载 //设置servlet发送的数据支撑HTML格式 response.setContentType("text/html"); //设置发送servlet 浏览html格式 utf-8 response.setCharacterEncoding("UTF-8"); //设置响应头 response.setHeader("content-disposition", "attachment;filenname=flower.jpg"); ServletContext sa=getServletContext(); String path=sa.getRealPath("/imges/yu.png"); InputStream is =new FileInputStream(path); byte [] bytes =new byte[1024]; int count=-1; OutputStream os=response.getOutputStream(); while((count=is.read(bytes))!=-1) { os.write(bytes,0,count); }
随机数的抽取
// 生成数字,随机数 //100000 -1000000 //[0,1]*900000=[0,900000]+100000 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); response.setHeader("refresh", "5"); //设置要求浏览器 /* response.sendRedirect("Servlet1"); */ int i=(int)(Math.random()*900000+100000); int a=(int)(Math.random()*9000+1000); int c=(int)(Math.random()*900+100); System.out.println("@@@@"+(new Random().nextInt(900000)+100000)); /* * 设置随机 */ System.out.println(new Random().nextInt(100)); System.out.println(Math.random()); PrintWriter pw =response.getWriter(); pw.print("你的支付宝到账1000万元,需要的码号为:<h1 style='color:red ;background-color:green'>"+i+"</h1>,打死也不说 \"<hr>\";"); pw.print("你的QQ到账1000万元,需要的码号为:<h2 style='color:red ;background-color:green'>"+c+"</h2>,打死也不说 \"<hr>\";"); pw.print("你的微信到账1000万元,需要的码号为:<span style='color:green'>"+a+"</span>,打死也不说"); pw.print("你的手机支付宝到账1000万<span style='color :red'>"+i+"</span>"); response.sendRedirect("Servlet2"); try { Thread.sleep(5000); Connection conn = Time.time(); } catch (Exception e) { e.printStackTrace(); } } //重定向 response.sendRedirect("Servlet2");
重定向 response.sendRedirect("Servlet2");
Servlect对象四Request对象服务器获得浏览器的数据
//获得浏览器的请求,得到请求信息 //得到请求的URL地址 String a=request.getRequestURL().toString(); System.out.println(a); //得到请求的数据 String b=request.getRequestURI(); System.out.println(b); //得到请求的URL地址中附带的参数 String c=request.getQueryString(); System.out.println(c); //得到来访者的IP地址 String d=request.getRemoteAddr(); System.out.println(d); //来访者的主机名 String e=request.getRemoteHost(); System.out.println(e); //来访者的端口号 int f=request.getRemotePort(); System.out.println(f); //得到请求URL地址时使用的方法(重要) String h=request.getMethod(); System.out.println(h); //获取WEB服务器的IP地址 String l=request.getLocalAddr(); System.out.println(l); //获取WEB服务器的主机名 String n=request.getLocalName(); System.out.println(n); //获取WEB服务器的端口号 int m=request.getLocalPort(); System.out.println(m); }
获得浏览器的数据
//获得浏览器发送过来的姓名和年龄的数据 String a=request.getParameter("name"); String b=request.getParameter("age"); String c=request.getParameter("phone"); String d=request.getParameter("QQ"); String e=request.getParameter("wexing"); System.out.println("获得浏览器发送给Servlet的数据为:"+a+"--"+b+"--"+c); //当浏览器发送的数据是同一个名称多个不同的数据 //servlet需要使用以下这个方法去接收这种数据 String[] ss=request.getParameterValues("hobby"); System.out.println(Arrays.toString(ss)); //tomcat服务器的编码格式是:ISO-8859-1 //注意:servlet获得浏览器表单发送的数据时, //获得的名称一定要和表单上文本框定义的name属性中的名称保持一致 //当浏览器发送大量数据给servlet的时候 //如果使用getParameter一个个获得,效率太慢 //使用以下方法可以节省代码,加快开发速度 Enumeration<String> e1= request.getParameterNames(); while (e1.hasMoreElements()) { //循环获得的是浏览器发给servlet的数据的名称 String name=e1.nextElement(); if (name.equals("hobby")) { String[] str=request.getParameterValues(name); System.out.println(name+":"+Arrays.toString(str)); }else { String value=request.getParameter(name); System.out.println(name+":"+value); } } //使用Map集合获得浏览器发送的所有数据 Map<String,String[]> map=request.getParameterMap(); for (Entry<String, String[]> entry : map.entrySet()) { String name=entry.getKey(); String[] values=entry.getValue(); System.out.println(name+"%"+Arrays.toString(values)); } System.out.println("运行完成"); System.out.println("http://localhost:8080/Day06-2/Servlet2?name=hubinjkf&age=23&phone=16745637856&qq=2675648967&wexing=16745679076&hobby=%E7%9C%8B%E4%B9%A6&hobby=%E7%9C%8B%E5%B0%8F%E5%AD%A6%E5%A6%B9&hobby=%E5%AD%A6%E4%B9%A0mysql"); }
服务器的跳转
//当浏览器访问Servlet3的时候,Servlet3自己跳转到Servlet4, //由Servlet4回复消息给浏览器 request.setAttribute("apple", "苹果"); request.setAttribute("banner", "香蕉"); request.setAttribute("ma", "五十个一百万"); request.getRequestDispatcher("Servlet4") .forward(request, response); response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter pw=response.getWriter(); String a=(String) request.getAttribute("apple"); String b=(String) request.getAttribute("banner"); String c =(String) request.getAttribute("ma"); pw.print("<h1 style=\"color: pink;\">收到Servlet3的请求,回复消息给浏览器,任务已完成,获得Servlet3携带的数据为:"+a+"</h1>"); pw.print("<h1 style=\"color: red;\">收到Servlet3的请求,回复消息给浏览器,任务已完成,获得Servlet3携带的数据为:"+b+"</h1>"); pw.print("<h1 style=\"color: yellow;\">收到Servlet3的请求,回复消息给浏览器,任务已完成,获得Servlet3携带的数据为:"+c+"</h1>"); }
Servlect对象五Cookie和Session对象。
response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter pw=response.getWriter(); //浏览器通过地址访问服务器的servelt //servlet要获得该浏览器所携带的所有cookie对象 Cookie[] cookies=request.getCookies(); if (cookies!=null) { //循环遍历每一个cookie,直到找到servlet能识别的cookie值为止 //tag,china for (int i = 0; i < cookies.length; i++) { //通过cookie中存储的数据的名称 String name=cookies[i].getName(); if ("AAA".equals(name)) { //这个cookie是服务器要找的东西,从cookie中获得中文数据需要进行解码 String value=URLDecoder.decode(cookies[i].getValue(), "UTF-8"); System.out.println(value); pw.print(value); break; } } }else { //没有cookie,说明当前浏览器以前没有访问过服务器 //创建cookie对象,存储中文数据的时候,需要对数据进行转码 Cookie cookie=new Cookie("AAA", URLEncoder.encode("bbbbbbbb", "UTF-8")); //设置浏览器退出后,cookie还能继续存在内存中的时间 cookie.setMaxAge(30); response.addCookie(cookie); pw.print("服务器给浏览器创建了一个cookie对象"); } }
/因为有密码,为了安全保障用do-post方法 response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); //首先获取文本框 String username = request.getParameter("username"); String password = request.getParameter("password"); /* * 创建对象HttpSession */ HttpSession session=request.getSession(); /** * 建立二个动态数据 */ session.setAttribute("username", "hug"); session.setAttribute("password", "123"); /** * 获得动态数据 */ String a=(String) session.getAttribute("username"); String b=(String) session.getAttribute("password"); String aa=request.getParameter("username"); String bb=request.getParameter("password"); System.out.println(aa+"获得浏览器index.jsp文件中数据"); System.out.println(bb+"获得浏览器index.jsp文件中数据"); PrintWriter pw =response.getWriter(); if (session.isNew()) { pw.print("浏览器是第一次访问服务器"); }else if (a.equals(aa)&&b.equals(bb)) { /** * 判断浏览器与我创建的服务器中的数据是否相等 */ pw.print("浏览器是第一次访问服务器"); response.sendRedirect("ServlectA"); }else{ //登录失败,跳转到失败页面 System.out.println("登录失败,跳转到失败页面"); response.sendRedirect("ServlectB"); } }
过滤器对象六
<!-- 第一部分·注册过滤器 --> <filter> <filter-name>MyFilter</filter-name> <filter-class>com.MyFilter</filter-class> <init-param> <param-name>username</param-name> <param-value>student</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>666666</param-value> </init-param> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <!-- 这表示可以拦截任何请求 --> <url-pattern>/Servlect1</url-pattern> </filter-mapping> <servlet> <servlet-name>ServlectA</servlet-name> <servlet-class>co.ServlectA</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServlectA</servlet-name> <url-pattern>/ServlectA</url-pattern> </servlet-mapping> <filter> <filter-name>MyFilter4</filter-name> <filter-class>com.MyFilter4</filter-class> </filter> <filter-mapping> <filter-name>MyFilter4</filter-name> <!-- 这表示可以拦截任何请求 *--> <url-pattern>/Servlect4</url-pattern> </filter-mapping>
listener对象七
package com.Listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class MyServlectListener implements ServletContextListener { public MyServlectListener() { // TODO Auto-generated constructor stub System.out.println("MyServlectListener的构造方法"); } @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("Listener程序初始化程序开启"); System.out.println("WEB ServletContextListener程序初始化程序开启ServletContext" + "Listener开始@@程序开始运行@@"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("Listener程序初始化程序结束"); System.out.println("WEB contextDestroyed==程序初始化程序in the endontextDestroyed程序结束" + "程序在结束中"); } } package com.Listener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MySessionListener implements HttpSessionListener { private static int count=0; public MySessionListener() { // TODO Auto-generated constructor stub System.out.println("MySessionListener() 构造方法"); } @Override public void sessionCreated(HttpSessionEvent se) { // TODO Auto-generated method stub System.out.println("当sesssion创建时执行程序 sessionCreated()构造方法"); se.getSession().getServletContext().setAttribute("count", ++count); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("当sesssion销毁时执行程序 sessionDestroyed()构造方法"); } }
九大内置对象
**四大作用域(有四个对象)有四个对象共享数据
seesion 浏览器不切
application 服务器不关闭
request:请求转发跳转页面的情况,只能两个页面共享数据
pageContext:该对象中只能页面自己用
才能用setAttribute的方法
将四作用域排序**
pageContext<request<seesion<application
**<%! %>:用于在jsp文件中定义全局变量和方法
<%= %>:用于在jsp文件中将java中的数据结果显示在html文本中
<% %>:用于在jsp文件中执行多行代码,包括if,while,for,创建对象等等
<%-- --%>:用于在jsp文件中的注释
<%@ %>:用于在jsp文件中操作指令代码**
Jsp常用的三大指令:page,include,taglib
page指令的常用属性: import:导入所需要的包 language:当前jsp页面里面可以嵌套的语言 contenType:设置响应流的编码,及通知浏览器用什么编码打开 pageEncoding:设置页面的编码 extends:声明当前jsp的页面继承于哪个类 session:设置jsp页面是否可以使用session内置对象 buffer:设置jsp页面的流的缓冲区大小 autoFlush:是否自动刷新 isELIgnored:是否忽略el表达式 errorPage:当前jsp页面出现异常的时候要跳转到的jsp页面 isErrorPage:当前jsp页面是否是一个错误页面
@1jsp:useBean
jsp:useBean:创建某一个JavaBean类的对象,需要把该对象存储至指定的四大作用域之一 id:填要创建的类的对象名称 class:填要创建的类的完整包的路径 scope:填四大作用域的标识 page:代表的是pageContext对象 request:代表的是request对象 session:代表的是session对象 application:代表的是application对象
@3jsp:getProperty
jsp:getProperty:用于获得jsp:useBean动作所创建的对象中所有全局变量的值 name:填对象名称 property:填属性名称或者变量名称
@2jsp:setProperty
jsp:setProperty:用于给jsp:useBean动作所创建的对象的全局变量进行赋值 name:填对象名称 property:填属性名称或者变量名称 value:填要赋予给全局变量的值
@4jsp:forwad
jsp:forwad:用于类似于请求转发的页面跳转方式 page:填写要跳转的页面
@5jsp:param
jsp:param:用于携带参数(如果传输的中文,需要进行编码格式转换) name:填参数名称 value:填参数的值
@6jsp:include
jsp:include:用于动态的将其他多个jsp页面引入或者包含某一个页面中 引入的过程中也可以使用jsp:param动作给这个子页面传输数据