Web应用chapter12.pptx_第1页
Web应用chapter12.pptx_第2页
Web应用chapter12.pptx_第3页
Web应用chapter12.pptx_第4页
Web应用chapter12.pptx_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十二章 高级Web应用程序开发,12.1 开发Servlet Servlet是用Java编写的服务器端程序, 它使用了Java Servlet应用程 序接口(javax.servelt.*, 简称API)及相关类和方法. Java Servlet可以动态地扩展Server的能力, 具有方便高效, 功能强 大, 可移植性好,易于维护, 性能稳定等优点. 12.1.1 在NetBeans中创建Servlet 点击”文件新建项目”, 打开”新建项目”对话框, 见下图, 点击 ”下一步”, 打开”新建Web应用程序”对话框.(page249),在”项目名称”输入”JSP_JavaBean_Servl

2、et_Login”, 如需更改项目位 置, 点击”浏览”; 设置为主项目. 点击 ”下一步”, 查看服务 器和上下 文路径. 点击”完成”. 这样就建成了新项目.,12.1.2 Servelt使用实例登录模块 2. 在完成12.1.1的第一步后, 把11.6.5节项目”JSP_JavaBean_Login” 中的index.jsp, error.jsp, welcome.jsp, 以及images子目录复制到 当前项目的Web目录下. 注意: 有可能需要先删除默 认的index.jsp, 才能拷贝 11.6.5节中的index.jsp, 或使用”删除重命名”组合. 3. 右击现项目, 选弹出菜

3、单 ”新建Java包”建一个包, 名为”login”. 右击包”login”, 选弹出菜单”新建 Servlet”, 打开”新建 Servlet”对话框, 见图.,在类名中输入”LoginServlet”, 注意项目和源包名, 点击”下一步” 打开”配置Servlet 部置”对话框, 如 图, 对应书中 图12-2page250, 选中”将信息添加 到部置描述符” 这样创建的 Servlet将自动添 加到Web.xml文件 中,否则就必须手 工进行添加. 注意Servlet的类 名, 名称和URL.,URL的格式一般为: “http:/your-server/your-web-project/

4、your-servlet-URL”. 在”配置Servlet部置”对话框中, 有如下配置: “Servlet名称”: 此文本框用于输入Servlet的名, 可以和类名不同, 仅是NetBeanIDE自己使用. “URL模式”: 文本框用于输入通过URL访问Servlet的路径, 例如”/LoginServlet”. 其中, your-server为服务器路径 your-web-project为web项目路径. your-servlet-URL为servlet的路径. 点击”完成”. 会生成如下代码.,LoginServlet.java的”protected void processReques

5、t()”方法中所生成的 默认代码如下: response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); try /* TODO output your page here. You may use following sample code. */ out.println(); out.println(); out.println(Servlet NewServlet); out.println(); out.println(); out.println(Servlet NewS

6、ervlet at + request.getContextPath() + ); out.println(); out.println(); finally out.close(); ,把上面代码修改成如下代码, 对应书中page252页源码: response.setContentType(text/html;charset=UTF-8); / get the users name and his password. String username = request.getParameter(username); if (username = null) username = ; Str

7、ing password = request.getParameter(password); if (password = null) password = ; /*The following code is to use the JavaBean LoginBean to * check whether the uses input are OK. */ boolean loginflag = false; LoginBean bean = new LoginBean(); bean.setUsername(username); bean.setPassword(password); log

8、inflag = bean.checklogin(); if (loginflag) request.getSession().setAttribute(username, username); response.sendRedirect(welcome.jsp); else response.sendRedirect(error.jsp);,在把上面代码写完后, 会有提示错误, 主要我 们没有LoginBean这个类, 把11.6.5节创建的项 目”JSP_JavaBean_Login”中源码LoginBean.java 拷贝到目前项目的源包”login”下: 右击项目” JSP_JavaB

9、ean_Login”中 的源码”LoginBean.java”,见右图.选择”复制”。 右击项目”JSP_JavaBean_Servlet_Login” 下的源包”login”, 选择”粘贴”, 就会把 LoginBean.java拷贝到新项目中来, 解决数据 库的密码验证问题. c.右击项目”JSP_JavaBean_Servlet_Login” “测试”, 消除某些不一致性. 完成了Servlet的开发.,4. 为了能够让Servlet处理用户请求(书中page252页), 这里要把 index.jsp文件中的下面两行代码: 请登录系统! 替换为: 请登录系统! 到此, 完成了Servle

10、t的登录模块的开发. 在这个实例中, 用Servlet代替了logincheck.jsp文件的功能. 在Servlet中通过访问数据库, 并根据访问结果实现不同的页面, 这样进一步把界面和控制逻辑继行了分离, 从而实现了一个基本 的MVC框架. 5. 运行测试: 先运行数据库, 点击”服务” ”数据库Java DB启动服务器”, 见右图 6.点击” JSP_JavaBean_Servlet_Login运行”.,12.2 使用过滤器,在Servlet2.3版中, 一个重要的功能就是支持能够为Servlet和JSP页 面定义过滤器. NetBeans提供了对Servlet2.3应用程序编程接口的

11、支持, 可以在集成开发环境中快速创建过滤器. 12.2.1 NetBeans中创建过滤器的方法 在创建Web标准项目后 (仍然使用上节的项目 ”JSP_JavaBean_Servlet_Login”), 选择”文件”新建文件” 命令, 打开”新建文件”对 话框. 在”类别”列表中选 择”Web”节点, 在右边的”文件类型”列表中选择”过滤器”节点, 单击”下一步”按钮, 打开“新建 过滤器”对话框, 书中图12-3page253.,在”类名”文本框中输入过滤器的名字. 如果要对请求和响应对象 进行包装, 则需要选中”包装请求和响应对象”复选框. 例如, 允许在将请求发送到过滤器链的其余部分之前

12、, 在请求上设置参数. 跟踪在响应上设置的Cookie. 单击”下一步”按钮, 打开”配置过滤器部置”对话框, 如下图所示 (图12-4page260). 选中”将消息添加到部置描述符web.xml”复选框, 这样创建的过滤器将自动添加到web.xml文件中, 否则就必须手工 进行添加. “过滤器名称”文本框用于输入过滤器的名字,可以与 类名不同.,单击”新建”, 可以打开”过滤器映射” 对话框, 图12-4page254, 选中”URL”单 选按钮, 然后在后面的文本框中输入 要被过滤的地址. 例如输入”/*”则表 示项目目录下的所有文件访问都要被,过滤; 如果输入”/data/*”, 则要

13、过滤data子目录下的所有文件访问. 如果要过滤Servlet, 则要选中Servlet单选按钮, 然后在后面的下拉 列表框中选择要过滤的Servlet. 单击”下一步”按钮, 打开”过滤器初始化参数”对话框, 如图12-6 Page254, 单击 ”新建”按钮, 可以 为过滤器添加初 始化的一些参数. 单击”完成”按钮, 创建过滤器, 创建 过滤器的代码如 下所示.,import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; i

14、mport javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class NewSimpleFilter implements Filter private static final boolean debug = true;

15、 private FilterConfig filterConfig = null; public NewSimpleFilter() private void doBeforeProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException if (debug) log(NewSimpleFilter:DoBeforeProcessing); / Write code here to process the request and/or response befo

16、re the rest of the filter chain is invoked. private void doAfterProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException if (debug) log(NewSimpleFilter:DoAfterProcessing); / Write code here to process the request and/or response after the rest of the filter c

17、hain is invoked. ,public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException if (debug) log(NewSimpleFilter:doFilter(); doBeforeProcessing(request, response); Throwable problem = null; try chain.doFilter(request, response); catch (T

18、hrowable t) / If an exception is thrown somewhere down the filter chain, we still want to execute our after processing, / and then rethrow the problem after that. problem = t; t.printStackTrace(); doAfterProcessing(request, response); / If there was a problem, we want to rethrow it if it is a known

19、type, otherwise log it. if (problem != null) if (problem instanceof ServletException) throw (ServletException) problem; if (problem instanceof IOException) throw (IOException) problem; sendProcessingError(problem, response); ,/* Return the filter configuration object for this filter. */ public Filte

20、rConfig getFilterConfig() return (this.filterConfig); /*Set the filter configuration object for this filter.param filterConfig The filter configuration object.*/ public void setFilterConfig(FilterConfig filterConfig) this.filterConfig = filterConfig; /* Destroy method for this filter */ public void

21、destroy() /* Init method for this filter */ public void init(FilterConfig filterConfig) this.filterConfig = filterConfig; if (filterConfig != null) if (debug) log(NewSimpleFilter:Initializing filter); /* Return a String representation of this object. */ Override public String toString() if (filterCo

22、nfig = null) return (NewSimpleFilter(); StringBuffer sb = new StringBuffer(NewSimpleFilter(); sb.append(filterConfig); sb.append(); return (sb.toString(); ,private void sendProcessingError(Throwable t, ServletResponse response) String stackTrace = getStackTrace(t); if (stackTrace != null ,其中, 在doBef

23、oreProcessing()方法中, 可以添加过滤前的处理代码; 在doAfterProcessing()方法中, 可以添加过滤后的处理代码; doFilter()方法是过滤的主要方法, 过滤代码应该添加到这个方法 中; init()方法是过滤器的初始化代码. sendProcessingError()方法用于发送处理过程中的错误; getStackTrace()方法用于获得跟踪栈中的信息; log()方法用于 输出过滤记录; 变量debug用于控制是否输出过滤记录, 当值为 true时(默认值)输出记录.,12.2.2 过滤器使用实例-为登录模块提供安全保护 在前面几个登录模块的实例中.

24、都只介绍了如何进行登录校验, 并没有增加任何的安全措施. 如果用户知道要访问网页的网址, 在不登录的情况下, 直接访问这些页面地址都是可以”绕过”登录 检验部分的. 本节将在12.1.2节实例基础 上, 利用过滤器为登录模块 增加一个”防火墙”, 把没有 登录的非法访问进行屏蔽. 在”项目”窗口中, 右键单击 12.1.2节创建的 JSP_JavaBean_Servlet_Login项目 节点, 选择弹出菜单中的”复制” 命令, 打开”复制项目”对话框,复制项目对话框, 图12-7page258. 2. 在”项目位置”文本框中选择新的 项目路径, 在”项目名称”文本框中 输入”FilterDe

25、mo”, 单击”复制”命令. 3. 在新项目的Web子目录下创建 一个data子目录, 后面创建的过滤 器将对这个目录中所有文 件的访问进行过滤, 没有登 录的访问将被屏蔽. 右击”Web页面”, 选择”新建” ”文件夹”, 打开”新建文件 夹”对话框, 后页图, 点击 ”完成”.,在data子目录中, 创建一个名为 ProtectedPage.jsp 的页面: 右击项目”FilterDemo”下的目录 “Web页data”, 选择”新建” ”JSP”, 打开”新建JSP”对话框. 见后页图.,在”文件名”文本框中填上”ProtectedPage”, 注意创建的文件和所 在的文件夹, 选择”J

26、SP文件”单选按钮, 点击”完成”. ProtectedPage.jsp页面, 用来模拟被保护的页面.其内容如下:, JSP Page 必须登录后才能查看 你好, 你已经登录了, 谢谢! ,4. 在login包中, 按照上一小节的方法 创建一个过滤器, 过滤器的名字为 ”LoginFilter”. 右击项目” FilterDemo”下的login包, 选择”新建过滤器”, 打开 ”新建过滤器”对话框 b. 在类名框中输入”LoginFilter”, 点击”下一步”, 准备配置过滤器.,c. 选择将信息添加到 部置描述符(Web.xml), 点击”编辑”按钮, 打开”过滤器映射”对话框, 选中”

27、URL”单选按钮, 在后面文本框中输入要被过滤的地址, 在这里输入”/data/*”, 则要过滤data子目录下的所有文件访问. 如果要过滤Servlet, 则要选中Servlet单选按钮, 然后在后面的下拉列表框中选择要过滤的Servlet. 点击”确定”, 再点击”下一步” 按钮, 打开”过滤 器初始化参数” 对话框, 右边图对应书中图12 -5和图12-4部分 Page254.,d. 此次过滤器的生成, 没有初始化参数, 见下图(书中图12-6page254) 点击“完成”, 以便生成过滤器源码.,对于过滤器, 所生成的源码中有四个核心方法: Init(): 此方法是过滤器的初始化代码.

28、 doBeforeProcessing(): 在此方法中可以添加过滤前的处理代码. doFilter(): 此方法是过滤器的主要方法, 过滤器的业务逻辑代码 应该添加到这个方法中. doAfterProcessing():在此方法中可以添加过滤后的处理代码. 可查看这四个方法,5. 在创建LoginFilter过滤器后, 在doFilter()方法中添加如下代码, 进行过滤. 首先从Session中读取用户名username, 如果用户名不存在, 则说明用户没有登录, 那么就把页面重新定向到登录页面index.jsp. doBeforeProcessing(request, response)

29、; Throwable problem = null; HttpServletRequest httprequest = (HttpServletRequest)request; HttpServletResponse httpresponse = (HttpServletResponse)response; HttpSession session = httprequest.getSession(); String username = (String)session.getAttribute(username); if(username = null | username = ) http

30、response.sendRedirect(./index.jsp); if(debug) log(被拦截一个未认证的请求); else try chain.doFilter(request, response); catch (Throwable t) / If an exception is thrown somewhere down the filter chain, we still want to /execute our after processing, and then rethrow the problem after that. problem = t; t.printSt

31、ackTrace(); doAfterProcessing(request, response);,6. 在部置项目后, 在地址栏输入Http:/localhost:8084/FilterDemo/index.jsp, 会看到如下页面, 在密码框输入正确密码 ”111”后, 就会看到,如下 页面, 此时过滤器未发生 作用.,右击项目”FilterDemo部置”, 打开浏览器, 在IE中输入 http:/localhost:8084/FilterDemo/data/ProtectedPage.jsp, 回车后马上会显示: Http:/localhost:8084/FilterDemo/index

32、.jsp 这表示非法的页面访问已经被过滤到index.jsp页面了.,此时, 在NetBeans右下角输出窗口中点击Apache日志,如图: 显示如下信息: 十月 20, 2014 6:01:18 下午 org.apache.catalina.core.ApplicationContext log 信息: LoginFilter:Initializing filter 十月 20, 2014 6:04:15 下午 org.apache.catalina.core.ApplicationContext log 信息: LoginFilter:doFilter() 十月 20, 2014 6:04

33、:15 下午 org.apache.catalina.core.ApplicationContext log 信息: LoginFilter:DoBeforeProcessing 十月 20, 2014 6:04:15 下午 org.apache.catalina.core.ApplicationContext log 信息: 被拦截一个未认证的请求 十月 20, 2014 6:04:15 下午 org.apache.catalina.core.ApplicationContext log 信息: LoginFilter:DoAfterProcessing,12.3 创建侦听程序,在初始化或销

34、毁Servlet上下文和会话时,以及在上下文或会话 中添加或删除属性时,侦听程序都会通过生命周期事件获知这 些操作。 在创建标准的Web应用程序后”FilterDemo”, 选择“文件”“新建文件”命令,打开 “新建文件”对话框。,在”类别”列表中选择”Web”节点,在右边的“文件类型”列表中 选择“Web应用程序侦听程序”节点,单击”下一步”按钮打开 ”新建Web应用程序侦听程序”对话框(书中图12-9page261),在 “类名”文本框中输入监听器的名字。在”要实现的接口中”,可以 选中不同的 复选框,以 监听不同的 内容。 单击”完成” 按钮,即可 创建监听器。,在选择“上下文侦听程序”

35、时,所产生的源码截图如下:,在选择”上下文属性侦听程序”时,所产生的源码截图如下:,在选择”HTTP会话侦听程序”时,所产生的源码截图如下:,在选择”HTTP会话属性侦听程序”时,所产生的源码截图如下:,在选择”请求侦听程序”时,所产生的源码截图如下:,在选择”请求属性侦听程序”时,所产生的源码截图如下:,12.4 使用标准标记库,JSP的一个优势就是可以使用标准标记库,加快程序开发。 JSP 标准标记库JSTL全称为Java ServerPages Standard Tag Library, 是一个不断完善的开源JSP标签库。本节将主要介绍NetBeans中 使用JSTL库的方法,下一节将介

36、绍如何自己开发标记库。,12.4.1 JSTL概述以及NetBeans对标准标记库的支持,JSTL是一个已标准化的标记库集合, 其开发的API规范可以在 下载. JSTL主要包括如表12-1所示的四个基本标记库. 表12-1 JSTL标记库集合(page262) 创建JSP页面后, 可以在NetBeans组件面板中看到如图12-10所示的 JSTL标记库. 其中JSTL Choose, JSTL If, JSTL For Each包含在核心库中; 数据库分类下的几个标记包含在数据库处理库中.,创建JSP页面后, 可以在NetBeans组件面板中看到如图12-10所示 的J

37、STL标记库. 其中JSTL Choose, JSTL If, JSTL For Each包含在核心 库中;数据库分类下的几个标记包含在数据库处理库中. 图12-10(page262),如果要在项目中使用JSTL库, 那么需要在项目的库路径中添加 JSTL库的路径, 右击项目,选择”属性”, 打开”项目属性”对话框,在类别列表中选择”库”, 在”编译”面板下选择”添加库”, 打开”添加库”对话框.,拉动”滚动条”,选择”JSTL1.1”, 点击 ”添加库” 如下面图(书中图12-11page262)所示.,同时要在使用JSTL标记页面开始的地方加上库路径的引用, 代码 如下: 如要使用数据库,

38、 还得在页面开始时, 添加对数据库的引用, 但在NetBeans7中不必添加数据库驱动程序, 查阅第七章. ,12.4.2 使用核心库标记,核心库标记包含, , , , 等标 记, 分别用于输出信息, 设置值, 选择和迭代, 下面分别进行介绍.,1. JSTL If 标记 NetBeans工具组件面板中的JSTL If图标用于插入标记, 进行条件判断. 在创建了JSP页面后, 从NetBeans工具组件面板中, 拖拽JSTL If图标到JSP页面中, 释放鼠标后会显示如图12-12所示的 ”插入 JSTL If”对话框. 输入图中参 数后,产生如下JSP代码: 其中:条件用于判断页面请求URL

39、中 名字为name的参数是否存在; “变量名称”文本框用于设置测试条 件结果值的变量名; “范围”文本框用于设置作用范围, 可有如下 几个选项: page: 当前页面范围内有效. request: 当前请求范围内有效. session: 当前会话范围内有效. application: 当前应用程序生命周期内有效.,JSTL If 标记的操作和演示 a. 通过“文件新建项目”, 打开新建项目对话框. b. 在”类别”列表中选择”Java Web”, 项目列表中选择”Web应用程序”, 如右图: c.点击”下一步”, 得到新建”新建 Web应用程序” 对话框, 在”项目 名称”中输入 ”JSTL_

40、Demo”, 且设置为主 项目, 见右 图. 点击 ”下一步”.,d. 注意”上下文”路径, 点击”完成”. 右击”JSTL_Demo”项目下的”index.jsp”的默认生成的文件, 选择弹出菜单中的”重命名”以便打开 ”重命名”对话框, 输入”JSTL_if”, 并把页面中的Hello World! 改为: JSTL if.,f. 从组件面板中把 “JSTL If”拖拽到指定位置,见图. 此图是把”JSTL If”, “JSTL Choose”, “JSTL For Each” 拖到指定位置.,g. 在文件”JSTL_if.jsp”中的代码为: JSP Page JSTL if Hello

41、 $! ,h. 运行测验. 运行前按照12.4.2把JSTL1.1库加进来, 然后运行项目, 在地址栏分别输入下面地址, 就得到书中图12-13, 12-14page263. http:/localhost:8084/JSTL_Demo/JSTL_if.jsp http:/localhost:8084/JSTL_Demo/JSTL_if.jsp?name=Robin 注意:由于此项目中 未有”index.jsp”, 如果 在地址栏中仅输入: “http:/localhost:8084 /JSTL_Demo”会出现 错误, 因为默认调用 “index.jsp”.,2. JST

42、L Choose标记 NetBeans工具组件面板中的JSTL Choose图标用于插入 标记, 进行多个条件判断.在创建了JSP页面后, 从NetBeans 工具组件面板中, 拖拽JSTL Choose图标到JSP页面中, 释放鼠标后 会显示如图12-15所示的”插入 JSTL Choose”对话框. (page264) 其中, “When条件数”文本框用于设置要处理的条件数. 如果选中 ”生成Otherwise语句”复选框, 则会自动生成 语句. 右边图将会自动创建如下代码: ,JSTL Choose标记的演示和操作 下面的演示和操作是一个简单的标记的使 用演示, 其作用根据URL链接中 名为name的参数值判断用户的 身份. 当用户为”Robin”时就显示 系统管理员身份, 当用户为 ”Apple”时就显示超级用户身份; 其他用户显示为一般用户. 右击项目”JSTL_Demo”, 选择 弹出菜单”新建其他”, 打开“新 建文件”对话框. 类别选择”Web”, 文件类型选择”JSP”, 点击”下一步”.,c. 在”文件名”中输入 “JSTL_choose”, 选择”JSP文件(标准语法)”, 点 击”完成”.,d. 把所生成的源”JSTL_choose.jsp”中的如下代码 Hello World!改为 JSTL Choose e. 从

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论