求Java web 佟刚 spring 笔记老师的笔记的 1434404661

求助!!! 谁有2011版魔乐MLDN李兴华主讲oracle的笔记,希望能发给我一份。 谢谢!!!! _百度知道
求助!!! 谁有2011版魔乐MLDN李兴华主讲oracle的笔记,希望能发给我一份。 谢谢!!!!
我有更好的答案
给你发了,请查收!!!!
那个不是2011版的啊 也不是很具体啊不过还是要谢谢你啊
MLDN讲的不怎么样,看过李兴华老师,马士兵老师,王勇老师,方立郧老师,徐培成老师,佟刚老师,张龙老师讲的java视频,个人感觉王勇老师,徐培成老师,方立郧老师,佟刚老师,张龙老师讲的不错。
动力节点会为你量身定制你适合的课程,我们将整个课程分为两个教学板块:第一块是java基础班,这是针对零基础的学员所开设的,主要讲的是javase的部分,学期一个月仅需800元;第二块就是全程就业班,专注于javaee,学期四个月分不同的课程,所以也就不同收费。动力节点师资力量雄厚,每个老师都是具备多年的开发经验的实战型老师,在中国java培训领域中具有极高的知名度和良好口碑,大家可以在网上搜索王勇老师的java教学视频,也可以直接在动力节点的官网上下载。动力节点欢迎大家前来咨询和报名!Y
为您推荐:
其他类似问题
mldn的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置: >>
传智播客JavaWeb重点知识随堂笔记
第二章 Servlet 使用入门在这一章里面我们将要学习以下几点内容: 1:CGI 与 Servlet 的区别 2:Servlet 体系结构 3:Servlet 的基础知识 4:Servlet 的输出 5:Servlet 的生命周期 6:HttpServletResponse 与 HttpServletRequest 几个重要方法 CGI 与 Servlet 的区别 1)在最早期的 Web 应用程序主要是 CGI(Common GateWay Interface 通用网关接口)。 2)这类 Web 应用程序是使用如 Perl 这样的语言来编写的。 3)CGI 有个致命的缺点,就是对每一个客户端,必须创建一个新的实例,这将占用大量的内存 4)为了解决这个问题,Servlet 出现了。 5)Servlet 是一个用 Java 编写的类,在服务器上运行,处理客户端的请求,并把结果放给客户端。 6)对于每一个客户端的请求,只需要创建一个 Servlet 的实例。从而大大的节省了内存 Servlet 体系结构 客户端: 客户端-----------&Web 服务器-----&Web 容器----&Servlet http 请求 服务器端: Servlet-------&Web 容器-----&Web 服务器----&客户端Servlet 的基础知识 1)要编写一个 Servlet,一般继承自 HttpServlet 抽像类。所以一般要导入包 javax.servlet.*与 javax.servlet.http.*; 2)自定义的 Servlet 一般要重写 doGet()方法和 doPost()方法 3)doGet 方法用来处理客户端通过 Get 方法发出的请求 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 4)doPost()方法用来处理客户端通过 Post 方法发出的请求 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 5)request 参数用来表示客户端的请求,response 参数用来服务器对客户端的响应 6)为了让一个 Serlvet 能够处理 Get 请求与 Post 请求。一般会在 doPost 的方法里面写上 doGet(request, response)表示把所有的请求转化成为 Get 请求 Servlet 的输出 1)Servlet 可以通过两种方法来输出运算的结果 A:通过 System.out.Print 方法。此方法会把结果输出到 Cmd 中,也就是 TomCat 中。 B:通过 response 参数的 getWriter()方法得到一个 PrintWriter 对像进行输出, 此输出会把计算结果输出到 IE 上,一般用此方法 PrintWriter out = response.getWriter(); out.printlnServlet 的生命周期 1)Servlet 的生命周期是指从一个 Servle 的创建开始到消亡的全过程 2)Servlet 的生命周期各阶段如下: A:实例化:也就是创建一个 Servlet 类的实例 B:初始化:向 window 申请资源。此时会自动去执行 Init 方法 C:服务:去不断地接受客户端的请求,并做出响应 D:释放:把以前分配的资源进行归还给操作系统,此时会自动执行 destroy 方法 举例: 做一个 servlet 计数器,用来输出 servlet 被调用了多少次 步骤: 1)定义一个全局变量 2)在 Init 中赋初值为 0 3)在 doGet 把变量加 1, 并输出 提问: 1)同时打开另外一个 IE 浏览器,做一个新的客户端,讨论计数器会不会清零 结论:不管有多少个客户端,都只有一份实例。 2)讨论什么时候计数器才会清零,关闭 TomCat 容器 结论:说明 Web 容器一旦关闭,则容器里面的 servlet 也就会消亡 HttpServletResponse 与 HttpServletRequest 几个重要方法 1:HttpServletResponse A:response.setContentType(&编码&) 设置向客户端输出的文本的编码,一般设为&text/ charset=GBK& response.setContentType(&text/ charset=GBK&); 如果不设置,可能会出现乱码 B rintWriter out = response.getWriter();产生一个 PrintWriter 对像,此对像能够把信息输入到网页中去 此对像不仅可以输出普通字符,还可以输出 html 标记 在不使用此对像时,应该关闭该对像。out.close(); C:response.sendRedirect(&Index.html&); 使页面进行跳转 2:HttpServletRequest A:request.getParameter(&变量名&) B:如果接受中文再输出会是乱码,为了解决这个问题,可以在接受之间加上 request.setCharacterEncoding(&GBK&); request.getParameter(&变量名&) 可以得到客户端以 Post 或 Get 方法提交过来的变量 举例: 1:创建一个登录的 Html 页面,通过 Post 提交到 Servlet 中,通过 Servlet 来判断数据库中用户名是否正确, 如果正确则跳到主页面,否则打印错误,并提供&返回&超链接 2:编写一个用于注册会员的 html 页面,让用户填写会员的资料后,能够把这些资料保存到数据库中去第三章 会话跟踪简介在这一章里面我们将要学习以下几点内容: 1:Servlet 中页面跳转的方法 2:Sevlet 中 session 对像 3:Serlvet 中 Cookie 对像 4:Serlvet 上下文 Servlet 中页面跳转的方法 1:request.getRequestDispatcher(&目标&).forward(request,response); 2:response.sendRedirect(&目标&); 3:forward 与 sendRedirect 的区别: A:forward 跳转之后在地址栏中显示依然是旧网页的地址,sendRedirect 显示的是新网页的地址 B:forward 只能跳转到当前 Web 程序中的页面,而 sendRedirect 可以跳到任何目录。 比如: request.getRequestDispatcher(&http://www.sina.com&).forward(request,response);错误 response.sendRedirect(&http://www.sina.com&); 正确什么是 Session 对像 1:首先你应该把 session 想像成为一个大盒子,里面用来存放客户的数据 2:当你打开一个网站的首页时,服务器就会为你创建一个大盒子,并且为这个大盒子编一个号, 于是这个大盒子就可以让你在这个网站的不同页面之间共享,直到你离开这个网站的时候,这服务器又会 收回这个大盒子 3:可见 session 对像的其中的一个功能就是为了实现让同一个客户端在不同页面之间实现数据共享. 但是一旦用户离开这个网站,那么 session 也就会自动消失 4:一个网站可以被很多人同时访问,访问的每一个人在打开主页时,都会有一个大盒子,即 session. 如果另一个用户也同时访问网站,他也拥有自己的 Session,但两个用户之间无法通过 Session 共享信息 5:以游泳分配一个柜子为例来说明 sesson 的用法 6:session 对像的常用手法: A:在一个页面里面创建一个 session 变量. B:在另外一个页面里面去使用该 session 变量.Session 对像的方法 1)在 Servlet 中要使用 Session,必须要使用 HttpSession 接口 2)Session 对像是一个数据集合,也就是一个 Session 对像里面可以放很多 session 变量, 每一个 Session 变量都可以存放数据 3)if(request.getSession().getAttribute(&IsLogin&)!=null) 判断一个 Session 变量 IsLogin 是否存在,只有存在才可以继续读取里面的数据 3)得到一个 IsLogin 变量的值 if(request.getSession().getAttribute(&IsLogin&)!=null) 只有判断存在了,才可以读数据 request.getSession().getAttribute(&IsLogin&): 4)request.getSession().setAttribute(&IsLogin&,&Yes&);设置 session 中 IsLogin 里面的值 什么是 Cookies 对像 cookies 对像可以客户端长期保存信息。在客户端的计算机里面会有一个 cookies 文件夹,那里就是存放客户端的信息的。当客户端第一次去访问某个网 站时,该网站就会在客户端的计算机里面偷偷地写入一个 Cookies 下一次再访问该网站时,它就会读取你的计算机硬盘上 cookies,并将新的信息保存在你的计算机上。 跟 session 不同的,cookies 是把信息存储在客户端,不是在服务器里面。 操作 cookies 1:得到所有的 Cookies Cookie[] cookies=request.getCookies(); 2:得到指定 Cookies 的名字: Cookie.getName() 3:得到指定 Cookies 的值 Cookie.getValue(); 4:设置指定 Cookies 的值 cookie.setValue(值) 5:添加一个 Cookies cookie= new Cookie(&Visted&,&1&); cookie.setMaxAge(10000);设置 cookie 的过期时间以钞为单位 response.addCookie(cookie); 4:修改指定 cookie 的值:注意修改之后也要重新添加,否则添加之后无效 cookie.setValue(值); cookie.setMaxAge(1000); response.addCookie(cookie);应用举例: 1:证明正常情况下,一个网页或 Servlet 的数据是不能给另外一个网页或 servelt 共享 做两个 servlet,一个 servlet 里面给一个 session 变量赋值,给一个私有变量赋值 在另外一个 servlet 里面去使用 session 变量与私有变量的值,看一下结果 2:有一个登录界面(login.html),一个主页面(index),在主页面里面有二个超链接分别为 无限下载,新闻快递。用户必须要登录之后进入主页面,然后才能使用这二个超链接功 能,如果直接使用 Index.html 则会提示没有登录,然后转到登录 界面 [注意使用 session 对像] 登录页面--------&转到 servlet1,用来处理用户名是否正确,如果正确,转到主页面,否则转到 错误页面 主页面----------&转到 servlet2,用来判断用户是否登录过,如果登录过则转到无限下载或新闻 快递页面,否则转到登录页面 3:统计某个客户端曾经访问某个网站的次数,和网站的所有访问次数 Cookie[] cookies=request.getCookies(); if (cookies!=null) //如果 cookies 不为空 { for (i = 0; i & cookies. i++) { if (cookies.getName().equals(&Visted&)) { } } if (i&cookies.length) //找到 { cookie= int n=Integer.parseInt(cookie.getValue()); cookie.setValue(Integer.toString(n+1)); cookie.setMaxAge(1000); response.addCookie(cookie); } else { cookie= new Cookie(&Visted&,&1&); cookie.setMaxAge(10000); response.addCookie(cookie); } } else //为空,一定要创建 { cookie= new Cookie(&Visted&,&1&); cookie.setMaxAge(10000); response.addCookie(cookie); } out.println(&你共访问网&+cookie.getValue()); 4:在登录时,选择自动登录,下次在登录时直接进入主页面 创建一个 Servlet,在里面判断是否有 Cookies,如果有则直接进入主页面, 如果没有则首先进入登录页面 Serlvet 上下文 1:Servlet 中的 Session 可以让同一个客户端在不同网页之间进行共享 2:Servlet 中的上下文可以让不同的客户端来共享一些数据,这些数据要存放在上下文中, 可以把上下文看成一个容器,里面存放的数据可以被所有客户端来共享 3:如何得到上下文的一个实例: ServletContext context=this.this.getServletContext(); 4:如何得到一个上下文指定键的值: if (context.getAttribute(&Pwd&)!=null) { Pwd=context.getAttribute(&Pwd&).toString(); } 5:如何设置一个上下文的值: if (context.getAttribute(&Pwd&)==null) { context.setAttribute(&Pwd&,&***&); } 举例: 1:通过示例,说明 Servlet 中的 Session 与上下文的不同 步骤: 1)做一个 appser1,在它里面创建一个 Session 和一个上下文, 创建在 appser2 中输出 Session 和上下文 2)打开 IE,先在同一个浏览器中先执行 appser1,再执行 appser2 3)打开另外一个 IE 直接执行 appser2,看数据共享情况 2:通过上下文做一个聊天室 A:一个登录页面,提交到 Dowithser 中 B:一个 Dowith 的 Serlvet 用来把 Dowithser 中的用户名放入 session 中 C:一个框架集,含有上下两部分,下一部分包含一个 talk.html 页面, 上一个是一个 topser 的 Servlet,用来显示所有发言第四章 JavaMail 和 Servlet 发送邮件的工作原理: 1:客户端把邮件发送给--------&发信服务器----&发送到目的地 2:发信服务器是各大电子邮箱的服务器。一般在前面加上 smtp。比如: smtp.sina.com,smtp.163.com,smtp.126.com 等 3:只要去申请一个免费的电子邮箱,就可以获得一个发信服务器 发送邮件必须需要两个包: mail,activation 包。这两个包可以在 jakarta-tomcat-4.1.31\common\lib 下面找到。一定要复制到 web 模块下面 WebMod\WEB-INF\lib 下面 发送邮件需要导入的包: import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; 发送邮件的涉及到的类 A roperties 类:用来指定发信服务器,和使用发信服务器时是否需要身份验证: Properties props = new Properties();//创建一个 Properties 的实例 props.put(&mail.smtp.host&, &smtp.sina.com&);//设置发信服务器 props.put(&mail.smtp.auth&, &true&);//要经过身份验证 B:Session 类,会话类。要发邮件必须要创建一个 Session 类 Session session = Session.getInstance(props); C:MimeMessage 类.用来指定发送邮件的标题,文本,等 MimeMessage message = new MimeMessage(session);//得到 MimeMessage 的实例 message.setFrom(new InternetAddress(&&));//设置发件人 message.addRecipients(Message.RecipientType.TO,&[url=mailto:chengyu-,chengyu-]chengyu-,chengyu-q [/url]&); //设置收件人,可以同时指定多个收件人 message.setSubject(&主题&);//设置邮件的主题 message.setText(&内容文本&);//设置邮件的内容文本 D:Transport 类。用来把邮件进行实际的发送 Transport transport = session.getTransport(&smtp&);//得到 Transport 类的一个实例 transport.connect(host, username, password);//连接发信服务器 transport.sendMessage(message, message.getAllRecipients());//发送邮件 transport.close();//发送之后关闭 说明: 1:选择发信人邮箱一定要是发信服务器里面申请的邮箱 比如: 如果发信服务器--------&smtp.sina.com 则发信人邮箱一定要是 sina 的邮箱,否则会出现错误 发送带有附件的邮件 具备知识: 要发送附件,必须有 Multipart 类。这个类用来负责管理附件, 一个 Multipart 类同多个 MimeBodyPart 构成。每一个 MimeBodyPart 就代表一个附件 如果要发送附件,则&文本&也代表一个附件。文本是附件的第一个 MimeBodyPartString host = &smtp.sina.com&; String from = &&; String to = &chengyu-&; String username = &chengyuqing110&; String password = &&; Properties props = new Properties(); props.put(&mail.smtp.host&, host); props.put(&mail.smtp.auth&, &true&); Session session = Session.getInstance(props); session.setDebug(true); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipients(Message.RecipientType.TO,to); message.setSubject(&这是试验&); //===设置附件的正文======================================= MimeBodyPart bp1=new MimeBodyPart(); bp1.setText(&正文&); //===============设置附件================================== MimeBodyPart bp2=new MimeBodyPart(); bp2.setDataHandler(new DataHandler(new FileDataSource(&c:\\过滤器.ppt&))); bp2.setFileName(MimeUtility.encodeText(&c:\\过滤器.ppt&)); //处理中文 //================================加入附件里面======================= Multipart mp=new MimeMultipart(); mp.addBodyPart(bp1); mp.addBodyPart(bp2); message.setContent(mp); //================================================================== Transport transport = session.getTransport(&smtp&); transport.connect(host, username, password); transport.sendMessage(message, message.getAllRecipients()); transport.close(); //==================================================================== 收邮件 String Uid =request.getParameter(&txtUid&);//邮件服务器的用户名 String Pwd =request.getParameter(&txtPwd&);//邮件服务器的密码 String Host =request.getParameter(&txtHost&);//邮件服务器的主机名,一般是 pop.sina.com 或 pop.163.com Properties props = new Properties(); Session Getsession=Session.getDefaultInstance(props);//建立 session Store store = Getsession.getStore(&pop3&); store.connect(Host,Uid,Pwd); Folder folder=store.getFolder(&INBOX&); folder.open(Folder.READ_ONLY); Message[] message=folder.getMessages(); message.getSubject()//得到邮件的主题message.getSentDate().toLocaleString()//得到发信日期 Multipart p=(Multipart)message.getContent(); //得到一个 Multipart,去读出附件 p.getBodyPart(0).getContent().toString();得到邮件的文本 //===========================================================================第五章 Jsp 简介Jsp 概念: 1:什么是 Jsp Jsp(Java Server Page)是一种 Java 服务器端技术。一个 Jsp 页面包括三个方面的内容 Html,JavaScript,Jsp 程序片断 2:如何写 Jsp 脚本 把 Jsp 脚本写在&% %&里面 把 Js 脚本写在&script&代码&/script&里面 3:可见 Jsp 实际上就是在 Html 语言中嵌入 Jsp 脚本 4:编写第一个 Jsp 应用程序 Jsp 的执行过程: 浏览器---&请求--------&Web 服务器----&找到 Jsp 页面----&编译 | | 浏览器&-------响应&------Serverlet 从该执行过程不难看出 Jsp 在最后实际上要变成 Serverlet 之后才能发给客户端 Jsp 与 Servelet 的区别: 1)Jsp 是在 Serverlet 的基础上发展起来的 2)Serverlet 一般用于处理没有界面的业务逻辑,如果处理有界面的程序,就显示比较笨拙 Serverlet 用 out.println 一句一句的输出 Html 标记(界面),当整个网页非常多且复杂的时候 就会有很多的 out.println 来输出 html 标记 3)Jsp 很好的解决了这个问题,对于 Html 标记可以直接书写,只有需要写程序代码时才以 &% %&的方式加入 4)Jsp 把界面部分与代码部分分离,这样可以在开发网站时实现分工。美工只管界面部分,而 程序员只管代码部分Jsp 的语法: A)Jsp 的输出:out.println 用来输出 1)输出字符串:out.println(&字符串&) 2)输出 Java 脚本:out.println(&&script&alert('我是真的爱你');&/script&&); 3)输出 Html 标记:out.println(&&a href=http://www.sina.com&新浪网&/a&&); 链接到 QQ 对话 ut.println(&&a target=blank href=http://wpa.qq.com/msgrd?v=1&uin=&site=walmart&menu=yes&留言&/a&&);B)表达式。&%=Java 表达式%&。表达式后面不要加分号 例如:&%=Math.max(100,90)%&,&%=3+4*5%&等 C)Scriptlet: Scriptlet 就是在&%.....%&里面嵌入 Java 代码。它在形式上与表达式的区别就是在 &%...%&里面没有&=&,而且中间是一段 Java 代码,不是表达式,每条语句要以分号 结尾。举例说明 D)声明:&% ! Java 变量,方法 %& 1):声明变量: &%! int a=3,b=4 %& 2)声明类: &%! public class stud { public String GetId() { return &W1&; } } %& 3)声明函数: &%! public int sum(int a,int b) { return a+b; } %& 说明: 1)声明变量即可以在&%! %&只能够声明,不能实现 比如:&%! int a=3,b=4,c; c=a+b;%&错误&%! int a=3,b=4,int c=a+b;%&正确 2)声明变量既可以&%! %&中声明,也可以在&%中声明%&。 &%! %&中声明的变量:servlet(Jsp 最终要转换成 Serverlet)的实例变量。 根据 Servlet 的原理,所以的客户端只共享一个 Serlvet 的实例,所以在此处定义的 变量可以其它的页面来共享,也就是具备有继承性 &% %&中声明的变量:是局部变量,只能够给本页面使用,不具备继承性 &%! int i=0; //实例变量,有继承性 %& &% i++; out.println(i); %& 与的区别 &% int i=0; //局部变量,无继承性 i++; out.println(i); %& 3)但是声明函数与类只能够在&%! %&中声明,而不能在&% %& 4)一般声明变量都在&% %&中声明,而声明函数与类都在&%!中声明%& 5)为了代码的可读性一般都把类用一个单独的 Java 文件来保存,而不会在一个 Jsp 页面中去定义 E)Jsp 指令: 1)Jsp 指令控制对整个页面的处理。 2)Page 指令: 1:导入 Java 包,与自定义的类 格式:&%@ page import=&aspproject.Student,java.util.*&%& 说明:自定义的类一定要放在 WEB-INF 下面的 classes 下面,不过只要引用了一个类, Jbulider 会自动的创建一个 classes 文件夹,并放入相应的类 2:当本页面发生错误时,跳转到错误页面进行处理 格式: 源页面:&%@page errorPage=&Error.jsp& isErrorPage=&false& %& 错误页面:&%@ page isErrorPage=&true& %& 说明:错误是当出现异常,但是没有捕获时,如果捕获了,则不会发生页面跳转 3)include 指令: 1:该指令用于把一个 Jsp 页面包含到另外一个 Jsp 页面中 2:格式:&%@ include file=&HeadPic.jsp& %& 说明:嵌入一个页面是为了重用这个页面,而不必在每一个页面上写一些相同的代码。 例如:在很多的 Jsp 页面中都要在顶部显示同样的图片,这时就不必在每个页面 都去包含这些图片,而是单独写一个文件来完成此任务,然后在其它的 Jsp 页面中 利用 include 包含即可作业: 1)编写一个 Java 类,用来描述学生。包含学生的学号,姓名,性别。声明三个实例,并加到 一个 ArraryList,并把结果显示在表格中 2)编写一个页面,让用户输入两个数和一个操作符,在另外一个页面显示计算的结果 3)做一个民意调查页面,来调查&在校大学生谈恋爱&,好,不好,不好说三个选项 一个页面:显示界面用来让用户进行投票,另外一个页面显示投票的结果 jtds 连接 Sql server 4)使用 Jsp 实现用户登录 //************************************************************************** Class.forName(&net.sourceforge.jtds.jdbc.Driver&); Connection conn = DriverManager.getConnection(&jdbc:jtds:sqlserver://chen:1433;DatabaseName=jsp&, &sa&, &&); java.sql.PreparedStatement ps = conn.prepareStatement(Sql); java.sql.ResultSet rs = ps.executeQuery(); //******************************************************************************第六章 Jsp 隐式对像Jsp 的隐式对像有以下几个: A ut 对像:主要用来进行输出1)输出字符串:out.println(&字符串&) 2)输出 Java 脚本:out.println(&&script&alert('我是真的爱你');&/script&&); 3)输出 Html 标记:out.println(&&a href=http://www.sina.com&新浪网&/a&&); B:request 对像:用来获取客户端的请求 1)request.getParameter(&名字&):获取用户提交过来的请求 2)request.getParameterValues(&名字&):获取单选框的值 3)request.getRemoteAddr():得到发送请求的主机名 4)request.getRequestURI():得到发送请求的 Url C:Response 对像:用来向客户端输出响应结果 1)response.setContentType(&编码&) 设置向客户端输出的文本的编码,一般设为&text/ charset=GBK& response.setContentType(&text/ charset=GBK&); 如果不设置,可能会出现乱码 2)response.setHeader(&refresh&,&1&);使页面进行刷新 扩展:response.setHeader(&refresh&,&5;URL=新页面&); 过 5 钞钟跳转到新的页面 3):response.sendRedirect(&Index.html&); 使页面进行跳转 D:Session 对像 E:application 对像。相当于 Serlvet 上下文 F ageContext 对像。只能够在同一个页面里面使用。一般很少用其中 PageContext,request,session,application 四种对像都可以通过 setAttribute()方法存储值,通过 getAttribute()得到值 但是四种对像的范围不一样 PageContext(也被称为 Page 对像):一个页面中 Request:一次请求中 session:一次会话中 application:一个应用程序中 范围大小是:application&session&request&pageContext举例: 1:举例显示会话计数、应用程序计数、页面计数的区别 2:做一个在线购物的例子第七章 JavaBean 和 Jsp 的标准动作 什么是 JavaBean: 1)是一个可重复使用的软件组件 2)JavaBean 实际上就是一个 Java 类,这个 Java 类可以重复使用 3)JavaBean 在网站开发中一般用来封装业务层和数据库操作 4)虽然我们可以像开发一个普通 Java 类一样去开发一个 JavaBean,但是 JavaBean 有它自己的规则 5)JavaBean 的规则: A:是一个公有类 B:具有不带任何参数的构造函数 C:具有 getXxx(),setXxx(),用来读取或写入 Bean 的属性(注意 get 与 set 一定要小写*******) 6)JavaBean 与 Java 类之间的区别在于 JavaBean 有特定的规则,并且不需要继承自特定的类。而 Java 类一定要继承自特定的类。 默认为 Object 类 为什么要使用 JavaBean: 1:以前编写 Jsp 时,都是在 HTML 代码中夹杂着一大堆的 scriptlet---即 java 代码段, 这样整个页面的可维护性,可复用性比较低 2:用 javaBean 可以有效的将 HTML 中夹杂的 java 代码段剥离, 然后包装成一个可在多个页面复用的&逻辑处理组件&,提高了页面 的可维护性,和可复用性如何来编写 JavaBean [选择 File--&new--&general--&JavaBean] public class BeanSum { private int num1; private int num2; public BeanSum() { } public void setnum1(int num1) { this.num1=num1; } public void setnum2(int num2) { this.num2=num2; } public int getnum1() { return this.num1; } public int getnum2() { return this.num2; } public int sum() { return this.num1+this.num2; } } 说明: 1:在 JavaBean 中除了有 set 与 get 方法之外,还可以其它的方法 2:在 JavaBean 的方法的变量大小写要符合 Java 的命名规则: 如果只有一个单词,则全部小写,如果一个变量名或方法由多个单词构成 则除第一个单词小写外,其它的单词第一个字母一律大写 比如:shopName 不能写成 ShopName 或 shopname setShopName 不能写成 SetShopName 或 setShopName如何使用 JavaBean A:嵌入 java 代码方式 &%@ page import=&demo.BeanSum& %& 下边就可以像在 java 语言中那样用了: &% BeanSum demo=new TestBean(); demo.num1=10; //取属性是一定要取小写的 num1,尽管定义时写的是大写] demo.num2=20; out.println(demo.sum()); %& 这一种方式也就完全把 JavaBean 当成了普通对像 B:使用 jsp 标记符方式 &jsp:useBean id=&demo& class=&demo.BeanSum& scope=&session& /& 相当于 BeanSum demo=new TestBean(); &jsp:setProperty name=&besum& property=&num1& value=&10& /&相当于 demo.num1=10; &jsp:setProperty name=&besum& property=&num2& value=&20&/& 相当于 demo.num2=20; &%out.println(demo.sum())%& 注意这一个代码要分开,因为这段代码既不是实例化 JavaBean 又不是属性。 C:感觉用&jsp 标记符方式&比起&嵌入 java 代码方式&困难,那是因为没有把 JavaBean 与表单元素结合起来 D:通过&jsp:setProperty name=&demo& property = & * & /& 能够自动地把上一个页面提交过来的同名的表单元素的值赋给所有的属性 E:举例: 源页面:&input name=&num1& type=&text& id=&num1& size=&12&& 名字为 num1 &input name=&num2& type=&text& id=&num2& size=&12&& 名字为 num2目的页面: &jsp:useBean id=&demo& class=&demo.BeanSum& /& &jsp:setProperty name=&demo& property = & * & /& 会自动赋值 &%out.println(demo.sum())%& F:在通过 jsp 标记来使用 JavaBean 时,有一个关键字 scope 用来指定这个 JavaBean 的活动范围 Page:只能在其页面时使用,当页面刷新时,就会将其销毁,这是默认的情况 session:一直存在于会话中,也就是说可以被同个客户端的不同页面之间共享 application:能够给所有的客户端来共享 G:也就是说不同的页面可以通过 Bean 交互, 而你在一个页面中的普通类, 就没有这个功能。Jsp 的标准动作: 1:&jsp:setProperty&用来给 JavaBean 设置值 2:&jsp:getProperty&用来得到 JavaBean 属性的值 3:&jsp:forwad page=&url&&用来把页面跳转到 page 所指的页面。 与 response.sendRedirect()的区别 1)response.sendRedirect()是在客户端进行跳转,地址栏中会出现新的页面的地址&jsp:forwad page=&url&&是在服务器端跳转,地址栏 中依然是以前旧的地址。被称为跳转 2)&jsp:forwad page=&url&&是传递请求,所以这个请求到下一个页面依然可以使用, 而 response.sendRedirect()是在跳转,请求在下一个页面不在可以使用 可以使用 request.setAttribute 来设置值。被称为&转发& 举例:让用户输入用户名和密码如果用户名正确则转到首页,如果错误则转到错误页面 4:&jsp:include page=&url& flush=&true&/&:用于把其它的页面合并到本页面 与&%@ include %&的区别: A:jsp:include 是动作,而&%@ include %&是指令 B:jsp:include 是在运行时进行合并,而&%@ include %&在编译时合并 Jsp:inclulde-----&1.jsp---&编译--&servlet | |---&合并 2.jsp---&编译--&servlet | &%@include %&----&1.jsp-----| |---&合并---&编译 2.jsp-----| 举例:做一个 JavaBean 让用户输入商品名称,商品数量,折扣。 然后根据商品名称求出单价,根据数量与折扣求出应付款第七章 Jsp 表达式语言 什么是 jsp 表达式语言: Jsp 用于在网页上显示动态的内容。通常需要在 Jsp 页面中嵌入 Java 脚本以 完成复杂的功能。但是大量的 Java 脚本使得 Jsp 页面难以维护。Jsp 表达式语言(Expression language) 可用于在 Jsp 页面上生成动态的内容,并代替 jsp 脚本元素,以一种更简洁方式来 显示内容。Jsp 表达式语言是从 Jsp2.0 规范开始支持的什么要使用 Jsp 表达式语言:可以更加简洁的实现下面的三个功能 1)简洁访问存储对像(PageContext,Request,Session,Application)里面的值 2)利用 EL 简洁访问从表单元素取过来的值取替 request.getParameter 方法 3)JavaBean 属性的简略记法 Jsp 表达式语言(EL)的格式: ${表达式}如何利用 EL 简洁访问存储对像的值 A:先对比。 页面 1.jsp 中 &% session.setAttribute(&Uid&,&chen&); %& &jsp:forward page=&jsp2.jsp&/& 页面 2.jsp 接受来自于 1.jsp 中的值 &% String Uid=&&; if (session.getAttribute(&Uid&)!=null) { Uid=session.getAttribute(&Uid&).toString(); } %& &h1&接受的值为&%=Uid%&利用 EL 进行改进 2.jsp 页面 &h1&接受的值为${Uid}&/h1& 结论: 1:通过 EL 访问非常简洁 2:如果值不存在,EL 返回值不是 NUll 而是空字符串 3:如果四种对像都有相同名字的属性, 则在能够访问的范围(注意)内查找的顺序为 PageContext,Request,Session,Application 找到第一个为止。也就是说如果此时能够访问 PageContext,Request,Session,Application。则 EL 的值为 PageContext 的值。 如果能够访问的范围为 Request,Session,Application 则 EL 的值为 Request 等等 4:可以通过${session|Request|Application|Scope.Uid}的形式来决定要取到什么范围的值举例:登录的例子,如果登录正确,则显示欢迎信息如何利用 EL 简洁访问从表单元素取过来的值用以取替 request.getParameter 方法 格式:${param.表单元素值} 注意表单元素值必须要有 name 属性 1.jsp1 页面:输入学号,语文,数学,化学 2.jsp2 页面:显示该学生的总分与平均分 改进:把显示的结果也放入 jsp1 页面中,能够达到保留表单元素值的目的 学号:&input type=&text& name=&txtId& value=&${param.txtId}&/&&br& 说明: 1)通过${param.表单元素名}取过来的值。默认为 String 类型,可以通过 ${param.表单元素名+0} 转换成为数值型 比如:比较两个数的大小 ${param.num1+0&param.num2+0} 而不能写成${param.num1&param2.num1} 其中 num1 与 num2 是表单元素。&10&&&4& 而 10&4 如何利用 EL 对 JavaBean 属性进行简略记法 格式 1:${BeanName.BeanProperty} 格式 2:${BeanName[&BeanProperty&] jsp1 页面:输入商品名,数量,单价,实付款 jsp2 页面:通过一个 ShopBean 求出实付款和找零 不使用 EL 表达式: 商品名:&jsp:getProperty name=&ShopBean& property=&shopname&/&&br& 数量: &jsp:getProperty name=&ShopBean& property=&amount&/&&br& 使用 EL 表达式: 商品名:${ShopBean.shopname}&br& 数量: ${ShopBean.amount}&br& 第八章 标签开发 为什么要自定义标签: 虽然 Jsp 里面付带有很多的标签,这是这些标签的功能和个数毕竟有限,为了得到功能更强大 并满足用户需要的标签,就要自己定义标签。自定义标签有两大优点: A:实现代码重用 B:封装数据的操作,把数据的表示与实现分离 D:虽然 JavaBean 以可以达到上述的要求,但是由于 JavaBeanJavaBean 不能与 jsp 页面进行通信(不能在 JavaBean 中使用隐式对像), 所以有时我们不得不将&极少量&的 java 代码 嵌入到 HTML 中 E:而标签由于可以使用 jsp 的所有元素,所以可以很好的与 Html 进行无缝连接,从而增加了 jsp 页面的可维护性与重用性 如何来自定义标签: A:编写标签处理程序,处理程序就是一普通的 Java 类,这个类必须要继承自 BodyTagSupport, 并实现其中的重要的两个方法 public class TagTest extends BodyTagSupport { public int doStartTag() throws JspException {} public int doEndTag() throws JspException { } } B:编写标签库的描述文件(*.tld)注意一定要放在 WEB-INF 文件夹下面 &?xml version=&1.0& encoding=&UTF-8&?& &!DOCTYPE taglib PUBLIC &-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN&&http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_2.dtd&& &taglib& &tlib-version&1.0&/tlib-version& //库的版本,随便写 &jsp-version&1.0&/jsp-version& //jsp 的版本,随便写 &short-name&tagtest&/short-name& //标签的缩写名 &tag& &name&tagtest&/name& //标签唯一名称,该名字决定了使用标签的名字 &tag-class&tagapp.TagTest&/tag-class& //标签处理器类名 &body-content&jsp&/body-content& //内容类型。一般为 Jsp,表示可以是 jsp 中的任何内容 &/tag& &/taglib& C:使用标签: 1:先导入标签库:&%@ taglib uri=&WEB-INF/TagTest.tld& prefix=&chen& %& 2:通过&前缀:标签名&标签体&/前缀:标签名& 编写标签库要注意的几项: 1:javax.servlet.jsp.tagext.*。提供创建标签库所需要的接口与类 2:在 doStartTag()里面不能访问 BodyContent 主体内容,因为此时主体内容还没有产生 3:如果在 doStartTag()里面返回值为 SKIP_BODY,则表示跳过了主体内容,则在 doEndTag 里面也不能访问 BodyContent 主体内容,否则会出现异常 4:所以如果要访问主体内容的操作,必须省略 doStartTag()或在 doStartTag()方法中 返回 EVAL_BODY_BUFFERED 表示不跳过主体内容,然后在 doEndTag()方法中去处理 5:doEndTag()方法可以返回 EVAL_Page(表示执行标签后面的页面代码)或 SKIP_PAGE(表示执行完标签之后就停止页面内容执行)一般返回 EVAL_Page 6:要在标签中进行输出,可以通过 pageContext 类的一个 getOut()方法: JspWriter out = pageContext.getOut(); out.println(&字符串&)进行输出 7:要在标签中访问 Jsp 中的隐式对像: HttpServletResponse response=(HttpServletResponse)pageContext.getResponse(); HttpServletRequest request=(HttpServletRequest)pageContext.getRequest(); pageContext.getSession() 8:要在标签中访问 Jsp 标签中的标签体的内容(一般在 doEndTag 中): this.bodyContent.getString();标签的分类: A:简单标签: 格式:&前缀:标签名/& 特点:没有属性也没有标签体 定义方法:只要实现 doStartTag()方法,并返回 SKIP_BODY 举例: 1)自定义一个标签,能够自动产生网页的 Log 画面 2)自定义一个标签,能够自动产生一个登录窗体 3)自定义一个标签,能够产生一个关闭超连接B:有标签体的标签 格式:&前缀:标签名&内容&/前缀:标签名& 特点:没有属性,但是有标签体 定义方法: 一般有标签体的标签,都是希望标签处理器能够对标签体进行操作,如上所述由于 doStartTag 本身不能对标签体进行引用,所以要对标签体进行操作只需要实现 doEndTag(),并返回 EVAL_Page 举例: 1)自定义一个标签,用来把标签的体中的英文字母由小写转换成为大写 2)自定义一个标签,以标签体作为消息提示来弹出一个对话框 C:有属性的标签(****) 格式:&前缀:标签名 属性名 1=值 1 属性名 2=值 2/& 特别:有属性,但是没有标签体 定义方法: 1)首先定义属性,通过 set 与 get 定义属性 2)由于没有标签体,所以只要实现 doStartTag()方法,并返回 SKIP_BODY 3)书写 Tld 标签描述文件。 &taglib& &tlib-version&1.0&/tlib-version& //库的版本,随便写 &jsp-version&1.0&/jsp-version& //jsp 的版本,随便写 &short-name&tagtest&/short-name& //标签的缩写名 &tag& &attribute& &name&num&/name& //属性名 &required&true&/required&//是否必须 &rtexprvalue&true&/rtexprvalue&//是否支持 jsp 表达式来为属性赋值,一般为 true &/attribute& &attribute& &name&num&/name& &required&true&/required& &rtexprvalue&true&/rtexprvalue& &/attribute& .................. &name&tagtest&/name& //标签唯一名称,该名字决定了使用标签的名字 &tag-class&tagapp.TagTest&/tag-class& //标签处理器类名 &body-content&jsp&/body-content& //内容类型。一般为 Jsp,表示可以是 jsp 中的任何内容 &/tag& &/taglib& 举例: 1)编写一个标签,有两个属性 num1,与 num2 求出其中的最大值 2)编写一个属性,传入一条不返回结果的 sql 语句,这个标签会自动执行对应的 sql 语句 3)编写一个标签,可以实现数据信息少量显示。主要以下属性: title,moreUrl,detailUrl,keyFiled,textFiled, 4)编写一个标签,传入商品类别,标签会查询出所有该类别的商品信息.标签文件 什么是标签文件: 1)传统的共享 Jsp 页面代码的方法是将代码放入一个单独的文件中,在需要的地方包含 这个文件。&%@ include file=&share.jsp&& 2)标签文件提供了一种更好的构建和重用模板的内容的共享方法 3)可以在标签文件中使用所有的 Jsp 元素。在标签文件中不能使用 page 指令 4)使用标签文件不需要实现任何类和接口,不使用 doStartTag()和 doEndTag()方法 5)不需要编写标签库的描述文件 6)一般而言,自定义标签用来处理业务逻辑,而标签文件用来实现界面模板共享(****) 如何创建并使用标签文件: 1)选择 File---&NewFile---&从文件类型中选择 tag 2)保存标签文件,注意一定要把标签文件保存在 WEB-INF/tags 文件夹下面 3)在标签文件的第一行写上:&%@ tag body-content=&scriptless& pageEncoding=&gbk& %& 其中 body-content 可以取: empty:表示是空标签,没有标签体 scriptless:表示在标签文件中可以接受文本、EL、JSP 动作 pageEncoding:用来指示标签文件所使用的编码。如果不指定会出现乱码 一般选择 scriptless 4)通过&%@ attribute name=&uid& %&指令可以为标签文件设置属性,在使用标签时 可以传递属性给标签文件,从而实现标签文件的动态调用 5)对于 attribute 指定的属性变量名,只能够通过 EL 来访问,不能通过 &% %&来访问 6)可以在标签文件内部使用&jsp:doBODY&来引用标签文件体的内容 7)标签文件的使用: A)&%@ taglib tagdir=&/WEB-INF/tags& prefix=&chen& %& 导入标签文件 B)&前缀:标签文件/& 或 &前缀:标签文件&标签体&前缀:标签文件/& 8)标签文件要与 jstl(jsp 标准标签库)结合,才能发挥它的最大作用标签文件应用举例: 1)通过标签文件实现,用于实现顶部和左边固定,右边变化。 A)做一个标签:top.tag 实现如下功能:首页|新闻快递|天气预报|在线娱乐|联系我们 B)做一个标签:left.tag 实现登录框与推荐文章列表功能 C)做页面 jsp1,jsp2,jsp3 去使用 top.tag、left.tag 2)自定义一个标签文件,用来实现传入商品数量,单价,实付款,输出应付款,和找零 3)自定义一个标签文件,能够自动产生一个登录窗体并设置一个表单的 action 属性,用来指定 登录窗体跳转的目的地 4)自定义一个显示少量热点新闻的标签文件 A)定义属性:title 标题 B)定义属性: titleColor:标题颜色 C)定义属性: detialColor:明细部分颜色 D)明细部分的内容,由&jsp:doBody&获得 什么时候用标签,什么时候用标签文件 1)如果处理的是没有界面的业务逻辑,并且必须使用 scriptlet(java 程序)就用标签 2)如果处理的是有界面的模板共享部分,既可以用标签,也可以标签文件, 不过由于标签文件实施起来更加简单,所以一般用标签文件第九章 Jsp 标准标签库 什么是 Jsp 标准标签库 1)Jsp 标准标签库(javaServer pages standard tag library)简称 jstl 是 jsp 已经为我们做好的 可以直接使用的用于编写和开发 jsp 页面的一组标准标签。 2)jstl 的最终目的是希望为我们提供一个无脚本环境,在此环境中用户可以使用标签来代替以前的 Java 程序段。 这样简化的 jsp 页面的开发,即使一个不懂 java 程序的用户也可以使用 jstl 来进行 jsp 页面的开发 3)jstl 包含三类标签: A)核心标签库 11)通用标签 22)条件标签 33)迭代标签 D)国际化与格式化标签库 E)Sql 标签库核心标签库 1)核心标签库由通用标签、条件标签、迭代标签所构成 2)通用标签用于操作 jsp 页面创建的范围变量 3)条件标签用于对 jsp 页面中的代码进行条件判断和处理 4)迭代标签用于循环遍历一个对像集合。相当于 C#中的 for earch 5)要使用核心标签库,必须经过两个步骤 A)设置工程需要库为 JSTL1.1--&选择 Project--& B)必须要导入核心标签库的 Url 格式如下: &%@ taglib uri=&http://java.sun.com/jsp/jstl/core& prefix=&c&%& 通用标签 1)通用标签用于设置、删除和显示在 jsp 页面内创建的变量值。 2)&c:set var=&变量名& value=&值& scope=&范围&/&用于设置变量值 其中的范围是:page,request,session.application,默认为 page 比如: &c:set var=&uid& value=&chen& scope=&session&/& rojectProperty--&RequiredLibrarles--&Add 相当于:&% session.setAttribute(&uid&,&chen&); %& 只不过一个是 jsp 标签,一个是 Javascriptlet Java 代码段 3)&c ut value=&${变量名}&/&用于显示变量的值或直接通过 EL 来进行显示${变量名}4)&c:remove var=&变量名& scope=&范围&/&条件标签 1)条件标签以支持 jsp 页面中的各种条件,共有两种类型 A)&c:if test=&条件& & 相当于 if (条件) 内容 { &/c:if& } 举例: 1)让用户输入两个数,求出最大值与最小值 提示:创建一个页面 max.jsp 页面,然后提交到 dowithmax.jsp 页面 &c:if test=&${param.num1&0+param.num2}&& &c:set var=&max& value=&${param.num1}&/& &/c:if& &c:if test=&${param.num1&0+param.num2}&& &c:set var=&max& value=&${param.num2}&/& &/c:if& 最大值是:&c ut value=&${max}&/&2)让用户输入商品数量、商品单价、选择是否是会员来核算应付款 一级会员:98 折 二级会员:97 折 三级会员:96 折 提示:创建一个 buy.jsp 页面,然后创建一个 dowithbuy.jsp 页面 &c:if test=&${param.vip==1}&& &c:set var=&discount& value=&0.99&/& &/c:if& &c:if test=&${param.vip==2}&& &c:set var=&discount& value=&0.98&/& &/c:if& &c:if test=&${param.vip==3}&& &c:set var=&discount& value=&0.97&/& &/c:if& 应付款:${param.amount*param.unitprice*discount} B)&c:choose& &c:when test=&条件 1&& 内容 &/c:when& &c:when test=&条件 2&& 内容 &/c:when& .............. &c 内容 &/otherwise& &/c:choose& therwise&1:修改上页的两例 2:让用户输入两个数和一个操作符,求出对应值 迭代标签 1)迭代标签相当于 C#中的 for earch,就是循环。 2)迭代标签有两种形式。一种是&forEeach&,另外一种是&forTokens& A):&c:forEeach var=&迭代变量名& items=&集合& varStatus=&状态变量名&& 内容 &/c:forEeach& 说明: var 表示变量名相当于 foreach(int item in 集合) 中的 item items:相当于 foreach 中的 item varStatus:是状态变量,可以省略 通常有: ${状态变量名.count}---从 1 开始的当前迭代项 ${状态变量名.index}---从 0 开始的当前迭代项举例: 1) &% String[] Car={&彩电&,&空调&,&手机&,&微波炉&}; %& 所有的汔车如下: &c:forEach var=&shop& items=&&%=Car%&& varStatus=&status&& &ul&第${status.count}种商品是${shop}&/ul& &/c:forEach& 2)从数据库中查询出一个 ResultSet 并存放 ArraryList。通过迭代标签进行输出 public class shop { public ArrayList getAllShop() { ArrayList shops = new ArrayList(); ResultSet rs = tagapp.DbManager.RunHasResultSql(&select * from shopinfo&); while (rs.next()) { shop demo = new shop(); demo.setId(rs.getString(1)); demo.setName(rs.getString(2)); demo.setUnitPrice(rs.getInt(3)); shops.add(demo); } } &jsp:useBean id=&demo& scope=&session& class=&tagapp.shop&/& &c:forEach var=&item& items=&&%=demo.getAllShop()%&&& ${item.id} ${item.name} ${item.unitPrice} &br& &/c:forEach& B):&c: forTokens items=&以分隔符分开的字符串& delims=&分隔符& var=&迭代变量名&& 内容 &/c:forTokens 应用举例: 1) &c:set var=&shops& value=&彩电,空调,热水器&/& &c:forTokens delims=&,& items=&${shops}& var=&item&& ${item}&br /& &/c:forTokens& 2)从数据库中取出由固定分隔符分开的某个字段的值 shop 表: s1-彩电-1200 s2-空调-1300 s3-微波炉-1500 国际化与格式化标签 1)国际化与格式化标签主要是用来实现一个 WEB 应用程序同时有几种国家的语言 2)必须要导入:&%@ taglib uri=&http://java.sun.com/jsp/jstl/fmt& prefix=&fmt& %& 2)原理: A:为每一种语言做一个资源文件。比如: app_en.properties(英文), app_zh.properties(中文) 格式形如:键=值 app_en.properties 文件的内容如下 uid=this my uid pwd=this my pwd login=login reset=reset app_zh.properties 文件的内容如下 uid=用户名 pwd=密码 login=登录 reset=重置 1:注意资源文件命名的规范:文件名_两个字符标识. properties 2:如果是中文为了避免乱码。要通过如下命令进行转换 native2ascii -encoding gb2312 源文件 目的文件 比如: native2ascii -encoding gb2312 app_zh1.properties(源文件) app_zh1.properties(目的文件) 3:资源文件一定要放在 WEB-INF\classes 下面,classes 一定要手动创建****** B:通过&fmt:setLocale value=&en 或 zh&/&来决定使用那种语言的资源文件 C:通过&fmt:setBundle basename=&app&/&来决定要加载那些资源文件 D:通过&fmt:message key=&pwd& /&来取出资源文件里面的值 E:注意 B,C 的顺序不能颠倒 举例: 1)登录的中文与英文的例子 &c:if test=&${param.language==null || param.language=='en'}&& &fmt:setLocale value=&en&/& &/c:if& &c:if test=&${param.language=='zh'}&& &fmt:setLocale value=&zh&/& &/c:if& &fmt:setBundle basename=&app&/& Sql 标签库 1)JSTL 的 SQL 标签用于访问数据库,它提供的各种标签可用于在 jsp 页面内直接访问 数据库,从而减少了 JavaScriptlet 代码 2)要使用 sql 标签库,必须要导入&%@ taglib uri=&http://java.sun.com/jsp/jstl/sql& prefix=&sql& %& 3)Sql 标签库由以下几种 A:设置数据源 格式:&sql:setDataSource driver=&sun.jdbc.odbc.JdbcOdbcDriver& url=&jdbc dbc:jsp& var=&conn&/&var:给数据源取一个别名,以后其它的 sql 标签将使用该变量做为数据源进行查询 scope:数据源变量的范围 B:对数据库进行更新操作 格式: &sql:update dataSource=&${数据源变量}&& 写上更新语句,是不返回结果的(delete,update,insert,create) &/sql:update& dataSource:指定进行数据更新的连接 比如: &sql:update dataSource=&${conn}&& update shopinfo set unitprice=unitprice+100 &/sql:update& C:对数据库进行查询 格式: &sql:query var=&shops& dataSource=&${conn}&& select 语句 &/sql:query& var:给查询的结果取一个变量名 dataSource:指定进行数据更新的连接 此标签经常与&forEarch&标签一起使用,来显示查询出的值 在使用&forEarch&时可以使用 begin end 来指定需要从那里开始到那里结束**** 比如: &sql:query var=&shops& dataSource=&${conn}&& select * from shopinfo &/sql:query& &c:forEach var=&row& items=&${shops.rows}&& ${row.id} ${row.name} ${row.unitprice} &/c:forEach& 说明: 1)&c:forEach var=&row& items=&${shops.rows}& begin=&1&& 从第二行开始,全部取到 2)&c:forEach var=&row& items=&${shops.rows}& begin=&1& end=&3&& 从第二行到第四行,全部取到 D:为 sql 语句中的参数设置值,它一般是&sql:query&与&sql:update&的子标签 格式:&sql:param value=&值&/& 比如: &c:set var=&id& value=&s1&/& &sql:query var=&shops& dataSource=&${conn}&& select * from shopinfo where id=? &sql:param value=&${id}&/& &/sql:query&举例: 1)通过标签从数据库查询出数据,并显示出来 2)从表单填写商品信息并添加到数据库中3)让用户从表单中选择部门编号,从另一个页面中显示所有该部门的职工2)在第一题的基础上进行数据的分页 &c:if test=&${conn==null}&& &sql:setDataSource driver=&sun.jdbc.odbc.JdbcOdbcDriver& url=&jdbc &sql:query var=&shops& dataSource=&${conn}& scope=&session&& dbc:jsp& var=&conn& scope=&session&/& elect * from test &/sql:query& &c:set var=&curpage& value=&1& scope=&session&/& //设置当前页的变量 curpage &/c:if& &c:choose& c:when test=&${shops.rowCount==0}&& 没的查询的结果 &/c:when& &c therwise& //开始查询&c:if test=&${param.page == 'next'}&& //如果是下一页 &c:if test=&${pagesize*curpage&shops.rowCount}&& //如果没有到末尾 &c:set var=&curpage& value=&${curpage+1}& scope=&session&/& &/c:if& &/c:if& &c:if test=&${param.page=='prio'}&& 如果是上页 &c:if test=&${curpage&1}&& //如果没有到首页 &c:set var=&curpage& value=&${curpage-1}& scope=&session&/& &/c:if& &/c:if& &c:forEach var=&row& items=&${shops.rows}& begin=&${pagesize*(curpage-1)}& end=&${pagesize*curpage-1}& & &tr& &td&&div align=&center&&${row.id}&/div&&/td& &td&&div align=&center&&${row.a}&/div&&/td& &td&&div align=&center&&${row.b}&/div&&/td& &/tr& &/c:forEach& &a href=&jsp1.jsp?page=next&&下一页&/a& &a href=&jsp1.jsp?page=prio&&上一页&/a& &/c therwise&&/c:choose&第十章 过滤器什么是过滤器: A:过滤器是封装了某些功能的一个 Servlet B:过滤器能够在服务器接受客户端的请求之前进行预处理,也能够在服务器处理完结果之后进行后处理 C:过滤器拦截请求和响应,以便以某种方式操作正在客户机和服务器之间交换的数据 D:客户端-----&(请求)过滤器-------&Web 服务器 或 Web 服务器--&响应----&客户 E:过滤器会在客户端发送请求和服务器响应客户端&自动&被调用 为什么要使用过滤器: 提出问题 1)阻止末授权访问 2)压缩数据 结论:如果有多个 JSP 页面和 Servlet 都需要进行一个相同或相似的操作,我们可以把这个操作放到一个过滤器 如何编写过滤器 A:过滤器一般会继承 HttpServlet 类,并实现 Filter 接口 B:过滤器一定要实现 Filter 接口中定义的三个方法: 1)public void init(FilterConfig filterConfig) throws ServletException //初始化 其中的 FilterConfig 参数用来读取过滤器的配置信息,如果过滤处理过程中 不汲及到读取配置信息,则可以不使用这个参数 2)public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) //执行 3)public void destroy()//销毁 C:doFilter 中的 ServletRequest 表示请求,ServletResponse 表示响应。 HttpServletRequest 是 ServletRequest 的子类,HttpServletResponse 是 ServletResponse 它的子类,为了得到更多的方法一般需要向子类进行转换 HttpServletRequest req=(HttpServletRequest) HttpServletResponse res=(HttpServletResponse) 在 doFilter 中进行程序处理之后,一定要调用 filterChain.doFilter(request,response); 来执行过滤器(**************)过滤器的生命周期 实例化---&初始化(去执行 init 方法)-----&过滤(执行 doFilter 方法)---&销毁(执行 destroy()方法)过滤器编写配置信息 1)过滤器只要经过配置之后,才能使用。 2)在 web.xml 中进行配置 3)语法格式: &filter& //用来描述过滤器 &filter-name&loginfilter&/filter-name& &filter-class&tagapp.loginFilter&/filter-class& &/filter& &filter-mapping& //过滤器的映射关系配置 &filter-name&loginfilter&/filter-name& &url-pattern&/*&/url-pattern& (表示所有页面都要经过过滤器过滤 &/filter-mapping& 4)这些都是 Jbulider 自动生成的,但是要有所了解过滤器的应用举例 说明:编写过滤器一定要搞清楚,不过滤的和过滤的页面 1)编写一个过滤器用来限制用户末登录就使用其页面 HttpServletRequest req=(HttpServletRequest) HttpServletResponse res=(HttpServletResponse) HttpSession session=req.getSession(); String url=req.getRequestURI(); if (session.getAttribute(&isLogin&)==null && !url.endsWith(&login.jsp&) && !url.endsWith(&check.jsp&) ) //说明没有登录 { res.sendRedirect(&login.jsp&); } filterChain.doFilter(request,response); 2)使用过滤器限制客户访问游戏网站的时间 HttpServletResponse res = (HttpServletResponse) HttpServletRequest req = (HttpServletRequest) Date demo = new Date(); int save = demo.getHours(); String url=req.getRequestURI(); if (!(save &= 8 && save &= 18) && !url.endsWith(&error.jsp&)) { res.sendRedirect(&error.jsp&); } filterChain.doFilter(request,response); 3)改进第 2 例中,使用参数配置来决定限制的时间段 A:设置参数 &filter& &filter-name&limitfilter&/filter-name& &filter-class&tagapp.limitFilter&/filter-class& &init-param& &param-name&starttime&/param-name& &param-value&8&/param-value& &/init-param& &/filter& B:读取参数 this.filterConfig.getInitParameter(&starttime&) 4)通过过滤器来解决从表单提交数据写入数据库中的乱码 正确情况下,如果从表单提交过来的数据是汉字,则会出现乱码。但是 可以通过 request.setCharacterEncoding(&GBK&)来设置,但是每一个 页面都来设置很复杂,于是可以通过过滤器来实现 request.setCharacterEncoding(&GBK&); filterChain.doFilter(request,response);第十一章:MVC 设计模式什么是 MVC 设计模式 1)在 JSP 出现早期制定了两种规范,称为 Model1 和 Model2。 2)在 Model1 模式中 jsp 同时肩负着两种角色:表示层与控制层,适应于开发简单的应用程序 3)Model2 与 Model1 不同的是,它把 Servlet 拉进来做为控制层,从而提高了 Web 页面的可维护性和重用性 4)Mvc 分为三层:模型(Mode)---View(视图)---&Control(控制器) 5)其中的模型就是数据业务层(JavaBean),视图就是 Jsp(表示层),控制器(Servlet) 6)视图把请求发给控制器,控制器调用模型进行处量,然后确定用哪个视图来显示模型处理返回的数据。 7)可见控制器扮演两种角色.1:调用 JavaBean.2:调用另外一个视图 8)登录页面(login.jsp)View---check(Servlet)控制器----&调用 loginBean--&返回结果---&index.jsp(视图) MVC 的应用举例 1)用户登录 2)分页举例 3)商品管理 解决乱码: String Name=new String(request.getParameter(&txtName&).getBytes(&iso-8859-1&)); out.print(Name); 修改 web 应用程序的默认页 把 TomCat 下面的\conf\web.xml 下面最后面的如下部分,复制到 Web 应用程序 web.xml 下面即可&welcome-file-list& &welcome-file&default.html&/welcome-file& &welcome-file&default.htm&/welcome-file& &welcome-file&default.jsp&/welcome-file& &/welcome-file-list& 在 web.xml 中设置参数,在 jsp 页面读出参数 步骤 1:在 web.xml 中加入以下代码 &context-param& &param-name&uid&/param-name& &param-value&chen&/param-value& &/context-param& &context-param& &param-name&pwd&/param-name& &param-value&123&/param-value& &/context-param& 2: //jsp application.getInitParameter(& //servlet request.getSession().getServletContext().getInitParameter(& arameterName&); arameterName&);+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++如果不想弹出对话框来实现页面跳转: response.sendRedirect(&login.html&); 如果想在弹出对话框之后,再来实现页面跳转: 都用 javascript 脚本 out.println(&&script&alert('提示信息');window.location='目标页面'&/script&&); 表单验证 1:对客户在客户端所填写的数据进行合法检验. 如果数据全部合法,则可以提交, 如果数据有一项不合法,就阻止提交 2:如何对表单进行验证: 步骤: 1)编写一个函数为 check 2)在函数里面进行数据合法性验证 3)在表单的 submit 事件里面写上: return check(); 正则表达式 1:正则表达式就是一些通配符 2: A:^:表示开始 B :表示结束C:[]:表示在中括号里面列出任意一个字符: 比如: [0-9]:取数字 [0-9a-z]:取数字和小写字母 [0-9a-zA-Z]:由数字和英文字母构成 [0-9a-zA-Z_-] D:{}:表示出现的字符个数,一定要写在[]的后面 比如: [0-9]{3}:必须是三个数字 [0-9a-zA-Z]{4}:必须要由四个数字或英文字母构成 [0-9]{2,}:必须至少由 2 位数字构成 [0-9a-zA-Z]{5,8}:必须由 5 到 8 位数字与英文字母构成 E:\.:相当于&.&举例: 1:用户名由 5 到 8 位数字与英文字母构成 ^[0-9a-zA-Z]{5,8}$ 2:符合 Email ^[0-9a-zA-Z_-]{1,}@[0-9a-zA-Z]{1,}\.[a-zA-Z]{1,}$1:一定要含有一个@ 2 不能在前面 3也不能在最后4:至少含有一个. 5:.不能 ai 着@符号 6:.不能开头正则表达式的使用: if (!表单.表单元素.value.match(&正则表达式&)) { ....... } +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 如何配置 Web 应用程序使之在本机上来调试 1:在 TomCat 的\conf\Catalina\localhost 文件夹下面创建一个与 Web 模块名相同的*.xml 文件 代码: &?xml version=&1.0& encoding=&UTF-8&?& &Context path=&/Web 模版名..& docBase=&F:\Java oop\java_excecise\..工程名..\.Web 模版名..& debug=&0& reloadable=&true& privileged=&true& /& 2:启动 Tomcat 找到 Tomcat 的文件夹,找到 bin\startup.bat,进行配置 在第二个横线下面写下 set JAVA_HOME=D:\JBuilder2005\jdk1.4 [jdk 的路径]JavaWeb 重点知识随堂笔记连载(第一天 XML&DTD 基础知识)一、XML 的作用 1、XML 是可扩展的标记语言。允许用户自定标签。 2、它被设计的宗旨是“描述数据”,而非显示数据(相对于 html 来讲) 3、XML 的标准是由 W3C(万维网联盟)指定的,目前使用的版本为 1.0 4、应用:作为配置文件 方式一:*.properties。key=value 的形式。无法描述层次关系 方式二:xml 作为配置文件。灵活,且能描述层次关系 二、XML 的基本语法(1~6) 1、XML 文档声明 a、表明了这是一个 XML 文档;必须出现在第一行; b、属性: *version:指定使用的版本号。1.0 *encoding:指定 xml 中出现的字符使用的编码。 注意:保存到磁盘上的文件所使用的编码要与 XMl 中声明的编码一致。 默认编码为:UTF-8 standalone:是否是单独存在(是否依赖其他的文件)。yes|no 2、XML 的元素 a、必须含有开始和结束标签 b、合理嵌套 c、必须且只有一个根元素 注意:XML 中不会忽略空格和换行 d、严格区分大小写 3、XML 标签的属性 a、属性的取值必须使用引号引起来 b、同一个标签中的属性名称不能重复 4、XML 的注释 语法:&!--这是注释--& a、注释要合理嵌套 b、XML 声明前不能有注释 5、CDATA 区 是 character data 的缩写 作用:被 CDATA 区包围的内容,会当做普通字符串处理 语法:&![CDATA[ 这是普通文本内容 ]]& 6、特殊字符(转义字符) & & & & ' 7、xml 的指令 作用:用来指挥软件如何解析 XML 文档 & & & & ' 语法:必须以“&?”作为开头,以“?&”作为结尾。三、XML 的约束之 DTD 1、概念: 格式良好的 XML 文档:遵守 XML 语法的文档 有效的 XML 文档:遵守约束的文档。 有效的 XML 文档必定是格式良好的。但格式良好的不一定是有效的。 2、约束文档定义了在 XML 中允许出现的元素名称、属性及元素出现的顺序等等 3、dtd 文件的扩展名是 dtd。保存到磁盘上时必须使用 UTF-8 编码 4、DTD 文档的编写方式 方式一:直接写在 XML 文件中(不用考虑编码问题) 语法: &!DOCTYPE 根元素 [ DTD 的声明 ]& 方式二:写在单独文件中(文件必须使用 UTF-8) DTD 文档在本地 语法:&!DOCTYPE 根元素 SYSTEM &DTD 文档的路径&& DTD 文档在网上 语法:&!DOCTYPE 根元素 PUBLIC &DTD 的名称& &DTD 的 URL 地址&& 5、DTD 的语法(看懂 DTD) 5.1 定义元素 语法:&!ELEMENT 元素名称 使用规则& 使用规则: (#PCDATA):Parsed Character Data 已解析的字符串。(普通文本) 作用:指定元素的主体内容为普通文本 EMPTY:指定该元素为一个空元素。即没有主体内容 ANY:用于指示元素的主体内容为任意类型 (子元素):指定该元素的孩子元素 子元素如果用逗号分隔,必须按照顺序编写子元素 如果子元素用“|”分开,说明任选其一 元素的出现的次数: +:至少一次 *:0 次或一次或多次 ?:0 次或一次 什么都不带:必须一次5.2 定义元素的属性(定以前元素必须存在) 语法: &!ATTLIST 元素名称 属性名 1 属性值类型 设置说明 属性名 2 属性值类型 设置说明& 属性值类型: CDATA:指定该属性的取值为普通字符 ENUMERATED (DTD 没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉) ID:表示属性的取值不能重复 #REQURIED:必须的 设置说明: #IMPLIED:该属性不是必须的 #FIXED:表示属性的取值为一个固定值。语法:#FIXED &固定值& 直接值:表示属性的取值为该默认值5.3 定义实体 定义实体就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的内容。 引用实体:在 DTD 中定义,在 XML 中使用 语法:&!ENTITY 实体名称 &实体内容&& 在 xml 中引用:&实体名称; 情况二: 参数实体:在 DTD 中定义,在 DTD 中使用(单独的 dtd 文件中) 语法:&!ENTITY % 实体名称 “实体内容”& 使用方式(注意是在 DTD 中使用):%实体名称; 一、XML 的数据解析 1、DOM 方式 Document Object Model,文档对象模型。这种方式是 W3C 推荐的处理 XML 的一种方式。 把 XML 文档当做一个树对待;对于增删改查非常地方便。 情况一: 缺点:构建此树,必须加载整个 xml 文档。导致内存溢出(XML 文件很大) 。 org.w3c.* 2、SAX 方式(推) Simple API for XML。这种方式不是官方标准,属于开源社区 XML-DEV,几乎所有的 XML 解析器都支持它。 优点:读取到文档的某一部分时就进行解析。占用内存小。 缺点:只能读。 org.sax.*; 3、PULL 方式(拉) 这种方式不是官方标准。http://www.xmlpull.org 优点:读取到文档的某一部分时就进行解析。占用内存小。 缺点:只能读。 org.xmlpull.*; 二、XML 的约束之 Schema(看懂 Schema) 1、Schema 约束本身就是一个 xml 文件,扩展名为 xsd 2、Schema 文档的跟节点固定为 schema 3、根据 Schema 编写 XML 头部信息的步骤: a、查看 Schema 文档,找到根元素。 --------------------------&书架& &/书架& --------------------------b、思考:书架来自哪个名称空间 schema 文档中的根元素的 targetNamespace 指定了名称空间。 XML 中引入该名称空间即可。使用 xmlns 关键字 --------------------------&itheima:书架 xmlns:itheima=&http://www.itcast.cn&& &/itheima:书架& --------------------------c、思考:http://www.itcast.cn 对应的 xsd 文件在何方? 使用 schemaLocation 去指定:名称空间 xsd 的路径 --------------------------&itheima:书架 xmlns:itheima=&http://www.itcast.cn& schemaLocation=&http://www.itcast.cn book.xsd&& &/itheima:书架& --------------------------d、思考:schemaLocation 来自何方? 来自一个标准的名称空间,需要使用 xmlns 来声明: xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& --------------------------&itheima:书架 xmlns:itheima=&http://www.itcast.cn& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xsi:schemaLocation=&http://www.itcast.cn book.xsd&& &/itheima:书架& --------------------------e、根据 schema 的定义,完成剩余的标签编写。都以 itheima 开头 4、xmlns 声明关键字可以声明默认名称空间 xmlns=http://www.itheima.com1、Web 的基本概念 a、web 资源的分类 静态资源:html、htm。用户看到的永远都是静态页面。css、js(客户端技术:运行在客户端) 。 动态资源:运行在服务器端,主要功能是输出静态内容。 (服务端技术:运行在服务器上) b、用 java 语言编写的服务器端程序,称之为 JavaWeb 2、JavaWeb 的服务器 JavaEE:多种 Java 开发技术的总称。 a、容器:指软件服务器程序。实现了什么规范的服务器就称之为什么容器。 支持的服务多,称之为重量级服务器。 b、轻量级的服务器:Tomcat。支持 JSP/Servlet 规范。 http://www.apache.org 3、Tomcat 的安装与启动遇到的问题解决 a、解压 Tomcat 进行安装时请不要放在有空格或中文的目录下。 b、启动 Tomcat:Tomcat 目录/bin/startup.bat. c、验证是否成功:http://localhost:8080 看到猫,证明成功! 启动 Tomcat 遇到的问题: 1、启动时一闪而过:需要配置环境变量 JAVA_HOME 指向 JDK 的安装目录即可。 2、端口被占用了:默认端口 8080.Web 中的默认使用的端口是 80 http://www.itheima.com:80 Catalina_home 环境变量指向 Tomcat 的安装目录。一般不建议配置。 环境变量: JAVA_HOME:执行 JDK 的安装目录 C:\jdk1.6.0_20 path:.....;%JAVA_HOME%\bin 保证能在任意目录下执行 java 命令 命令搜索顺序:内部命令 外部命令 当前目录下:exe com bat 依次从 path 环境变量中指定的目录下搜索。 环境变量的改变,当前窗口不起作用。需要开启新窗口。 classpath:.;%JAVA_HOME%\jre\lib\rt.%JAVA_HOME%\lib\dt. d、Tomcat 的目录结构(应用厂商自己制定的) bin:存放启动 Tomcat 的一些命令。 conf:Tomcat 的配置文件所在目录。server.xml 最为重要。 lib:Tomcat 所需的 jar 包 logs:tomcat 运行日志 temp:临时文件 webapps:存放 JavaWeb 应用的。默认目录。此目录中有几个文件夹,就说明当前 Tomcat 管理着几个 JavaWeb 应用 work:Tomcat 的工作目录 4、JavaWeb 应用的标准目录结构(SUN 公司制定) MyApp(应用名称) html、htm、css、js a\a.html WEB-INF:必须有。且写法固定。(此目录中的资源,客户端无法直接访问) classes:必须有。且写法固定。放编译后的 class 文件的。com.itheima.Class1.class(\WEB-INF\classes\com\itheima\Class1.class) lib:必须有。且写法固定。存放当前应用用的 jar 包。 注意:应用中的 lib 中的 jar 只为当前应用服务。Tomcat 中 lib 下的 jar,所有应用共用。 类的搜索顺序:应用的 classes 目录\应用的 lib 中的 jar\TOmcat 的 lib 中的 jar web.xml:当前应用的配置文件。必须有。且写法固定。5、如何部署应用到服务器上 a、直接将应用的目录拷贝到 Tomcat/webapps 目录中(开放式目录部署) b、打成 war 包,拷贝到 Tomcat/webapps 目录中 进入应用的目录:c:/MyApp 执行 jar -cvf MyApp.war . 访问应用的资源 url 的写法: 访问 MyApp 应用目录下的 index.html http://localhost:8080/MyApp/index.html 6、Tomcat 的组成结构 配置虚拟目录:Context 代表一个 web 应用 方式一:Context 元素是 Host 元素的子元素。 (修改 server.xml。不建议使用。该文件更改后,需要重启 Tomcat 才起作用) &Context path=&/MyApp& docBase=&c:\MyApp&/& path:虚拟目录名称。必须以/开头 docBase:应用的真是存放路径。 方式二: (推荐的方式。此种方式不用重新启动 Tomcat) 在 Tomcat 安装目录/conf/[enginename]/[hostname]目录下建立一个[contextPath].xml 配置文件 [enginename]:server.xml 中引擎的名称生成的文件夹 [hostname]]:server.xml 中引擎下的主机名称生成的文件夹 [contextPath]:新建的配置文件的主文件名就是应用的虚拟路径 在该文件中添加以下内容: &?xml version=&1.0& encoding=&gbk&?& &Context docBase=&c:\MyApp&/& 案例:配置默认端口、默认应用、默认主页 默认端口:80(W3C 规定。HTTp 协议) 把 8080 改为 80.修改 server.xml,找到 8080 端口的连接器 Connector. 默认应用:在 Tomcat 安装目录/conf/[enginename]/[hostname]目录下建立一个名字为 ROOT.xml 的配置文件。 (比较特殊,需要重新启动) 默认主页:修改应用中的 web.xml &welcome-file-list& &welcome-file&a.html&/welcome-file& &welcome-file&index.jsp&/welcome-file& &/welcome-file-list& 配置虚拟主机:Host server.xml 中的 Host 元素用于配置虚拟主机。 &Host name=&主机域名& appBase=&所有应用所在的文件夹路径&/& 配置 SSL:https:Connector HTTPS=http+SSL.默认的端口是 443第一部分、HTTP 协议 1、HTTP 协议的组成 请求部分 GET / HTTP/1.1 Accept: */* 请求行:位于请求的第一行 请求消息头:从第 2 行开始至第一个空行Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.; .NET CLR 3.5.30729) Host: localhost:8080 Connection: Keep-Alive username=admin&password=123 响应部分 HTTP/1.1 200 OK Accept-Ranges: bytes ETag: W/&448000& Last-Modified: Mon, 28 Nov :48 GMT Content-Type: text/html 响应行:位于响应的第一行 响应消息头:从第 2 行开始至第一个空行 Server: Apache-Coyote/1.1请求正文:第一个空行之后的全部都是请求正文 Content-Length: 7777 Date: Sat, 15 Sep :06 GMT .....响应正文:第一个空行之后的全部都是响应正文 浏览器显示的就是正文中的内容2、各组成部分详解 请求部分 GET / HTTP/1.1 请求方式 请求的资源路径 协议版本号 GET:请求方式。常用的有 GET、POST GET 方式:默认方式。直接输入的网址。 表单数据出现在了行中。url?username=abc&password=123 特点:不安全;有长度限制(&1k) POST 方式:可以通过表单 form method=&post& 表单数据会出现在正文中。 特点:安全;没有长度限制 *Accept:浏览器可接受的 MIME 类型.MIME 类型:文件系统中使用扩展名来区分不同文件类型的。 在 web 中使用 MIME 类型来区分文件类型。 (Tomcat\conf\web.xml 中有所有的 MIME 类型,比如 text/html) Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集 *Accept-Encoding:浏览器能够进行解码的数据编码方式,比如 gzip Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。 可以在浏览器中进行设置。 *Referer:包含一个 URL,用户从该 URL 代表的页面出发访问当前请求的页面 应用:防盗链;统计网站投放广告的效果 *Content-Type: application/x-www-form-urlencoded 提交的内容类型 form 表单的 enctype=&application/x-www-form-urlencoded&的默认值 *If-Modified-Since: Wed, 02 Feb :56 GMT 利用这个头与服务器的文件进行比对,如果一致,则从缓存中直接读取文件 *****Cookie:这是最重要的请求头信息之一 。会话技术有关Warning: w1 Warning: w2username=admin&password=123 响应部分 HTTP/1.1 200 OK请求正文:第一个空行之后的全部都是请求正文协议版本号 响应码 描述 响应码: (实际用到的 30 个左右。其他都是 W3C 保留的) 。 描述:对响应码的描述 常用响应码: 200:一切正常 302/307:请求的资源变更了 304:资源没有被修改过 404:资源不存在 500:服务器程序有错*Location: http://www.it315.org/index.jsp 指示新的资源的位置。配合响应码 302/307 来使用。 302/307+Location:请求重定向 Server:apache tomcat 指示服务器的类型 *Content-Encoding: gzip 服务器发送的数据采用的编码类型 Content-Length: 80 告诉浏览器正文的长度 *Content-Type: text/ charset=GB2312 服务器发送的内容的 MIME 类型 *Refresh: 1;url=http://www.it315.org 指示客户端刷新频率。单位是秒 *Content-Disposition: filename=aaa.zip 指示客户端下载文件 *****Set-Cookie:SS=Q0=5Lb_nQ; path=/search 服务器端发送的 Cookie 会话技术有关 *控制客户端不要缓存内容的 Expires: -1 Cache-Control: no-cache (1.1) Pragma: no-cache (1.0).....响应正文:第一个空行之后的全部都是响应正文 浏览器显示的就是正文中的内容-------------------------------------------------------------------第二部分、Servlet 入门 一、Servlet 概述 1、Servlet 是 SUN 制定的一套开发动态 Web 页面的规范。它是 JavaEE 技术中的一种 2、Tomcat 服务器实现了 Servlet 规范。XX 容器:实现了什么技术的服务器就称之为什么容器。 二、如何编写一个 Servlet:编写步骤 1、建立标准的 JavaWeb 应用的目录结构 FirstApp WEB-INF classes lib web.xml 2、进入 WEB-INF/classes 目录下,编写一个类 package com.itheima. import javax.servlet.*; import java.io.*; public class HelloServlet extends GenericServlet{ public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{ String data = &Hello World&; res.getOutputStream().write(data.getBytes()); } } 3、编译该类。不要忘记设置 classpath,把 servlet-api.jar 加进来 set classpath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar javac -d . HelloServlet.java 4、映射 Servlet。修改 web.xml 文件 &?xml version=&1.0& encoding=&GBK&?& &web-app xmlns=&http://java.sun.com/xml/ns/javaee& xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xsi:schemaLocation=&http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd& version=&2.5&& &servlet& &servlet-name&fuck&/servlet-name& &servlet-class&com.itheima.servlet.HelloServlet&/servlet-class& &/servlet& &servlet-mapping& &servlet-name&fuck&/servlet-name& &url-pattern&/fuck&/url-pattern& &/servlet-mapping& &/web-app& 5、部署当前 web 应用,拷贝到 Tomcat\webapps 目录下,并启动 Tomcat 6、访问:http://localhost:8080/FirstApp/fuck 三、GenericServlet 和 HttpServlet 抽象类 1、如果直接实现了 Servlet 接口或者继承 GenericServlet,需要实现 service 方法。 2、如果是继承 HttpServlet,不要覆盖 service 方法。 原因:在 HttpServlet 的 service 方法中,有标准的 HTTP 请求处理。会根据用户的请求方式,分发给 doXXX 方法。 (模板方法设计模式) 而 doXXX 方法,给了一个错误的输出,且是 protected 类型的。 所以:在继承 HttpServlet 编写 Servlet 时,应该覆盖掉 doXXX 方法。 3、修改 MyEclipse 生成 Servlet 的模板 a、关闭 MyEclipse b、在 MyEclipse 的安装目录下搜索*wizard*(com.genuitec.eclipse.wizards_8.5.0.me.jar) c、打开该 jar 包,templates 目录下找 Servlet.java 的文件,该文件就是模板 d、修改前先 备份细节: 1、同一个 Servlet 可以被映射到多个地址上 2、可以使用通配符*进行映射 有两种写法: 以&/&开头,以*结尾 以&*&开头多个通配符匹配的原则:&/&开头的优先级高,找最匹配的。 3、如果某个 Servlet 的映射为&/&,那么该 Servlet 就是缺省 Servlet,它负责在 web.xml 没有对应的 url 请求时的处理。四、Servlet 的生命周期 Servlet 对象在创建时会执行 init 方法,第一次被访问时。 destory 方法会在释放对象时执行。 service 方法:每一次请求都会调用该方法。 在 web.xml 中,注册 Servlet 时,如果配置了以下标签&load-on-startup&1&/load-on-startup&(取值为一个正整数) 那么 Tomcat 在加载该应用时,就会完成对该 Servlet 的实例化和初始化。 出现的问题:线程安全 1、尽量使用局部变量;实在是必须使用实例变量时,做同步处理,尽量包含少的代码。 SingleThreadModel:实现该接口能解决资源竞争问题。具体处理办法,由服务器决定。 a、把代码做了同步处理 b、搞了一个对象池:Tomcat 采取该方式五、ServletConfig 接口 代表某个 Servlet 的初始化参数。每个 Servlet 都有自己对应的 ServletConfig 对象。 getInitParameterNames() :获取所有的参数名称 getInitParameter(java.lang.String name) :获取指定参数的取值。参数和取值对应&init-param&标签 &servlet& &servlet-name&ServletDemo5&/servlet-name& &servlet-class&com.itheima.servlet.ServletDemo5&/servlet-class& &init-param& &param-name&xxx&/param-name& &param-value&yyy&/param-value& &/init-param& &init-param& &param-name&aaa&/param-name& &param-value&bbb&/param-value& &/init-param& &/servlet&六、ServletContext 接口 1、相当重要。代表当前 JavaWeb 应用。每一个 JavaWeb 应用都有自己的 ServletContext 对象。 2、是一个域对象。 (Map&String,Object&)可以通过以下方法存取该域 Object getAttribute(String name) void setAttribute(String name,Object obj) void removeAttribute(String name) 3、可以读取当前应用的全局参数 web.xml &web-app& &context-param& &!-- 全局参数配置 --& &param-name&encoding&/param-name& &param-value&ISO-8859-1&/param-value& &/context-param& &/web-app& 4、getRealPath(String path) 获取当前 JavaWeb 应用中的任何资源。path 必须以/开头,代表当前应用。 5、实现请求转发 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher(&/servlet/ServletContextDemo6&); rd.forward(request, response);//转发 a、转发前,会清空 response 的缓存。因此,转发前所有的 response 输出都无效。 b、转发后,所有的输出也无效。 注:转发前不要清空 response 对象的缓存。只有目标资源的输出才会显示。 七、读取配置文件的三种方式 xml、properties 1、ServletContext.getRealPath(String path) 可以读取当前应用中的任何资源。 2、ResourceBundle 读取*.properties 的文件。 只能读取类路径下的 properties 的配置文件。 3、类加载器加载配置文件 只能读取类路径下的所有的资源文件。第一部分、HTTP 协议 1、HTTP 协议的组成 请求部分 GET / HTTP/1.1 Accept: */* 请求行:位于请求的第一行 请求消息头:从第 2 行开始至第一个空行Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.; .NET CLR 3.5.30729) Host: localhost:8080 Connection: Keep-Alive username=admin&password=123 响应部分 HTTP/1.1 200 OK Accept-Ranges: bytes ETag: W/&448000& Last-Modified: Mon, 28 Nov :48 GMT 响应行:位于响应的第一行 响应消息头:从第 2 行开始至第一个空行 Server: Apache-Coyote/1.1请求正文:第一个空行之后的全部都是请求正文 Content-Type: text/html Content-Length: 7777 Date: Sat, 15 Sep :06 GMT .....响应正文:第一个空行之后的全部都是响应正文 浏览器显示的就是正文中的内容2、各组成部分详解 请求部分 GET / HTTP/1.1 请求方式 请求的资源路径 协议版本号 GET:请求方式。常用的有 GET、POST GET 方式:默认方式。直接输入的网址。 表单数据出现在了行中。url?username=abc&password=123 特点:不安全;有长度限制(&1k) POST 方式:可以通过表单 form method=&post& 表单数据会出现在正文中。 特点:安全;没有长度限制 *Accept:浏览器可接受的 MIME 类型.MIME 类型:文件系统中使用扩展名来区分不同文件类型的。 在 web 中使用 MIME 类型来区分文件类型。 (Tomcat\conf\web.xml 中有所有的 MIME 类型,比如 text/html) Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集 *Accept-Encoding:浏览器能够进行解码的数据编码方式,比如 gzip Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。 可以在浏览器中进行设置。 *Referer:包}

我要回帖

更多关于 佟刚javaweb 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信