300cd35c7e6ff8d49c5dfdb51d14ff77.ppt
- Количество слайдов: 122
高级网站设计 经济管理学院信息管理教研室 陈冈
高级网站设计 本课程主要内容 þEclipse 3. 2、JBuilder 2005 þServlet的使用 þJava. Bean的使用 þ服务器的安装和配置 apache与tomcat的整合使用、基本身份验证、摘 要身份验证、JDBCRealm验证、Data. Source验证、SSL 保护 þWeb高级应用 文件上传与下载的实现、Cookie管理、页面缓存、文件操 作的实现、基于listener的计数器
高级网站设计 本课程主要内容 þ数据库高级应用 数据库性能优化、数据库连接池、 þ邮件发送和接收 邮件服务器meark、邮件发送和接 收
高级网站设计 本课程要求的前导知识 þHTML基本语法 þJSP基本知识 þTomcat、resin基本配置 þ数据库基本知识,例如SQL语 句、mysql数据库 þJSP中与数据库的JDBC连接
高级网站设计 本课程主要涉及的软件 1。JDK 1. 5. 0 2。Tomcat 5. 5. 7 3。my. SQL 4. 0、 my. SQL-Front 3. 2 4。Dreamweaver MX 2004 5。 Eclipse 3. 2
高级网站设计 如何成为一个优秀的jsp程序员 1、建立并且理解你的Web Server。 2、 保证你理解 HTML 。 花时间学习手 写作html是很有必要的。因为你将会使用 JSP 和 HTML 混合编程,精通HTML语法是重要的。所以, 你必须能流利地写 HTML 。 训练时间: 2 ~ 4 个星期。 3、开始学习 Java 。 理解 Java 基础是很重要的。不用担心学习Swing或 Java 的 图形方面,因为在JSP 中你不会使用这些特征。集中精力在 Java 作的细节,学习 Java 的逻辑,也在 Java Bean上 花时间。学习Applet是好的, 但是就象Swing, JSP 的大多 数应用将不使用小程序。 训练时间: 3 ~ 6 个星期。
高级网站设计 如何成为一个优秀的jsp程序员 3、学习 Java. Script 学习怎么将 Java. Script在HTML中验证输入的 Form元素。也学习 Java. Script怎么能在一 HTML 页以内修改Form的元素。最后要求你 能从一 HTML 页内的事件中触发 Java. Script Function。 训练时间: 1~ 2 个星期。 4、学习并且理解你的Web Server的更多细节。 熟悉Web Server的特征,这是很重要的。 训练时间: 2 天。
高级网站设计 如何成为一个优秀的jsp程序员 5、建立你的 JSP Server 推荐以Tomcat开始。它可以很好地运行JSP程序。 当你不能在生产使用Tomcat时,学习尽可能多的知 识以便于更好的运行程序。另外, 许多 JSP 程序员 使用Tomcat。因此当你遇到一个问题时,你将容易 发现帮助。 安装时间: 1~ 2 天。 6、开始学习 JSP 。 基本的 JSP 学习通过的步骤 1到步骤 6可以完成, 然 后使用 JSP 对象和脚本写 JSP 程序来联系。 训练时间: 4 ~ 6 个星期。
高级网站设计 如何成为一个优秀的jsp程序员 7、学习更多的 JSP server。 没有关于更多的 JSP Server当然也可以运 行jsp程序。然而, 许多 JSP server都由自己 特殊的特征,可以让你更好的理解你的JSP 程。 学习更多的Jsp server如何处理jsp程序是有 必要的。同样也可以优化你的 JSP 应用程序, 并且使之运行得更快而不出任何问题。 训练时间: 2 ~ 7 天。
高级网站设计 如何成为一个优秀的jsp程序员 8、 学习 JDBC 。 JSP 大多数应用将使用数据库,JDBC 被用 于数据库连接。经常忽略的一个事实就是, 每个 JDBC Driver 所支持的东西是相当不同的。 了解并熟悉在jsp 程上被使用的 JDBC driver的细节是很重要的。(有时这部 分的学习被包含在前面 Java 或JSP的学习中 了 。) 训练时间: 1~ 2 个星期。
高级网站设计 如何成为一个优秀的jsp程序员 到现在,你已经成为了熟练的 JSP 程序员。仍 然有很多需要学习,你可以考虑扩展你的知识比如 DHTML , XML ,java证书, JSP Tag Libraries 或 Servlets , 看你想要造什么类型的网站而决定了。 这些训练是JSP 的核心。你不必都学习上面所 有的, 取决于你在 程中分配到什么任务和你已经 有什么知识。但是这是成功地训练程序员的时间表。 关键的单元是时间。平均的说, 5 个月时间确实能够 训练一个人 ( 从开始到完成 ) 成为一个对jsp熟悉程 序员。5 个月时间似乎很长,但要成为一个资 深的WEB程序员所学的东西远远不止 5个月 和以上内容。
高级网站设计 第一章 配置系统环境 1。安装JDK 1. 5. 0:http: //Java. sun. com 2。安装Tomcat 5. 5. 7 著名的Apache Group的Jakarta小组开发( http: //www. jakarta. org)。 3。设置环境变量 JAVA_HOME:c: javajdk 1. 5. 0 classpath:. ; C: javajdk 1. 5. 0libtools. jar; C: javajdk 1. 5. 0libdt. jar path:%JAVA_HOME%bin; 这一句放在最前面,否 则eclipse启动不了 4。安装my. SQL
高级网站设计 5。安装Eclipse http: //www. eclipse. org/downloads/index. php 目前为止,大多数 Java™ 程序员都听说过 Eclipse, 它正迅速成为最流行的 Java 编程环境。在目前所有的IDE 中,Eclipse可以说是最有发展前途的产品之一。Eclipse最 初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999 年 4月。目前由IBM牵头,围绕着Eclipse项目已经发展成为 了一个庞大的Eclipse联盟,有150多家软件公司参与到 Eclipse项目中,其中包括Borland、Rational Software、 Red Hat及Sybase,最近Oracle也计划加入到Eclipse联盟中。 Eclipse 是否与其他花钱的 IDE 一样好? 答案非 常确定!对于编码、调试、重构、单元测试等等, Eclipse 可以与任何一种 IDE 匹敌,甚至比它们还 要好。与昂贵的 JBuilder 2005 版本相比,您可能会 发现 Eclipse 对很多特性的支持都比 JBuilder 更好。
高级网站设计 6。下载My. Eclipse Eclipse插件,开源软件。使Eclipse 支持EJB、JSP、Servlet等等等。 www. myeclipseide. com 直接安装即可。
高级网站设计 第二章Servlet的使用 2. 1理解Servlet 1。认识Servlet 是封装的Java类,可以认为是服务器上的 小应用程序。 其优点: 平台无关性; 执行效率高; 应用广泛;例如:信用卡、在线支付等等。 因此非常适合于服务器端的处理与编程。 其缺点: 不容易表现网页的风格。
高级网站设计 2. 1理解Servlet 2。Servlet运行环境 编写Servlet源程序(. java) 编译为class 放置在服务器相应目录 配置web. xml 3。Servlet程序结构 主要由三大部分: >定义包 >导入必需的类 >声明Servlet名称 初始化、处理用户响应、清除释放资源
高级网站设计 package bysservlet; import javax. servlet. *; import javax. servlet. http. *; import java. io. *; public class Servlet 7 extends Http. Servlet { //Initialize global variables public void init() throws Servlet. Exception { } //Process the HTTP request public void service(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. set. Content. Type(CONTENT_TYPE); Print. Writer out = response. get. Writer(); out. println(“hello,every one!"); out. close(); } //Clean up resources public void destroy() { } }
高级网站设计 4。Servlet的生命周期 装载Servlet程序 Web Server创建 Servlet的实例 Web Server调用Servlet 的init()方法 Web Servlet等待客户端请 求 一个客户端请求到达Web Server Web Server创建一个请求对象 Web Server创建一个响应对象 Web Server 激活service方法,传递参数、处理客户 端请求 Web Server不再需要时,释放 资源
高级网站设计 5。Servlet常用方法 qdo. Get() qdo. Post() qservice() qinit() qdestroy()
高级网站设计 6。Servlet示例1 package bysservlet; import javax. servlet. *; import javax. servlet. http. *; import java. io. *; public class testservlet extends Http. Servlet { private static final String CONTENT_TYPE = "text/html; charset=GB 2312"; //Initialize global variables public void init() throws Servlet. Exception { }
高级网站设计 //Process the HTTP request public void service(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. set. Content. Type(CONTENT_TYPE); Print. Writer out = response. get. Writer(); out. println("<html><head><title>testservlet</title></head>"); out. println("<body>"); out. println("<meta http-equiv='refresh' content='3; URL=index. jsp'>"); out. println("<font style='color: #ff 0000; font-size: 11 pt'>请稍 候,系统 3秒后自动返回主页。。。</font>"); out. println("</body>"); out. println("</html>"); out. close(); } //Clean up resources public void destroy() { } }
高级网站设计 7。Servlet的配置 在web. xml中加入: <servlet> <servlet-name>testservlet</servlet-name> <servlet-class>bysservlet. testservlet</servletclass> </servlet> <servlet-mapping> <servlet-name>testservlet</servlet-name> <url-pattern>/tests</url-pattern> </servlet-mapping>
高级网站设计 8。Servlet示例2 获取用户表单传递的参数值,并显示在屏幕上。 基本思路: 1、编写JSP表单,其action设置为servlet 2、编写Servlet,在Web. xml中配置好,利用 do. Post()或者do. Get()或者service()接收用户 表单提交的数据。 思考: 使用do. Post()、do. Get()或者service() 接收表单提交的数据有无规律可循?能否将 成绩表的数据利用Servlet显示为Excel表格 且用户可以另存为excel的xls文件。
高级网站设计 9。认识listener Servlet package listener; import javax. servlet. *; import javax. servlet. http. *; import java. io. File. Writer; public class listener. Servlet extends Http. Servlet implements Servlet. Context. Listener, Servlet. Context. Attribute. Listener, Http. Session. Listener, Http. Session. Attribute. Listener { //Notification that the web application is ready to process requests public void context. Initialized(Servlet. Context. Event sce) { } //Notification that the servlet context is about to be shut down public void context. Destroyed(Servlet. Context. Event sce) { } //Notification that a session was created public void session. Created(Http. Session. Event se) { } //Notification that a session was invalidated public void session. Destroyed(Http. Session. Event se) { } }
高级网站设计 10。Listener Servlet的配置 在web. xml中加入: <listener> <listener-class>listener. Servlet</listenerclass> </listener>
高级网站设计 思考与练习 1、编写Servlet,显示一个简单成绩单表格。 2、编写Servlet,通过JDBC访问数据库。 3、编写Servlet,根据用户表单提交的用户名、 密码判断用户是否是合法用户(用户名为 111、 密码为 222表示合法用户)。 4、编写Servlet,输出excel表格。 5、如何在Servlet中实现页面包含? 6、如何编写Servlet,实现文件下载功能。 7、如何编写listener Servlet,实现计数器功能。
高级网站设计 第三章 Java. Bean 3. 1 Java. Bean概述 1。什么是Java. Bean是描述Java的软件组件模型。 通过Java. Bean可以无限扩充Java程序的功能, 通过Java. Bean的组合可以快速的生成新的应 用程序。 对于程序员来说,最好的一点就是 Java. Bean可以实现代码的重复利用,另外对 可以实现代码的重复利用 于程序的易维护性等等 也有很重大的意义。 Java. Bean在服务器端应用方面表现出来了越 来越强的生命力。
高级网站设计 1。什么是Java. Bean 比如说一个购物车程序,要实现购物车中添加一 件商品这样的功能,就可以写 一个购物车操作的 Java. Bean,建立一个public的Add. Item成员方法, 前台Jsp文件里面直接调用这个 方法来实现。如果 后来又考虑添加商品的时候需要判断库存是否有货 物,没有货物不得购买,在这个 时候我们就可以直 接修改Java. Bean的Add. Item方法,加入处理语句来 实现,这样就完全不用修改前台 jsp程序了。 当然,也可以把这些处理操作完全写在jsp程序中,不 过这样的jsp页面可能就有成百上千行,光看 代码就是一个 头疼的事情,更不用说修改了。由此可见,通过 Java. Bean 可以很好地实现逻辑的封装、程序的易于维护等等。 如果您使用Jsp开发程序,一个很好的习惯 就是多使用Java. Bean。
高级网站设计 2。一个简单的Java. Bean package dbbeans; public class my. Bean { public my. Bean() { } }
高级网站设计 3. 2 Java. Bean的构成 1。Java. Bean构成 一般由属性、方法组成。 由属性、方法组成 Java. Bean的值是通过一些属性获得的,你可通过 这些属性访问Java. Bean设置。以一个人来打比方, 这个人就是一个Java. Bean,这个人的名字、身份证 号码以及住址就是其属性。 Java. Bean的方法是指 你赋予其能够执行的任务。类似于一个人,骑自行 车就是其方法。 在JSP网站,你基本上就是通过Java. Bean来使 你的网站动态化。
高级网站设计 2。Java. Bean的使用 <jsp: use. Bean id=“name” scope=“周 期" class="package. class“/> 或者: <jsp: use. Bean id=“name” scope=“周 期" class="package. class“> </jsp: use. Bean>
高级网站设计 例如: <jsp: use. Bean id="info" scope="page" class=“mybean. insertinfo"/> <jsp: use. Bean id="info" scope="page" class=“mybean. insertinfo“> </jsp: use. Bean>
高级网站设计 2。Java. Bean的使用 一旦你声明了一个Java. Bean,你就 可以访问它的属性来定制它。要获得属 性值,请用“<jsp: get. Property>”标记。 有了这个标记,你就能指定将要用到的 Bean名称(从use. Bean的"id"字段得到) 以及你想得到其值的属性。实际的值被 放在输出中: <jsp: get. Property id="local. Name" property="name" />
高级网站设计 2。Java. Bean的使用 要改变Java. Bean属性,你必须使用 “<jsp: set. Property>”标记。对这个标记,你需要再次 识别Bean和属性,以修改并额外提供新值。如果命 名正确,这些值可以从一个已提交的表中直接获得: 参数获得: <jsp: set. Property id="local. Name" property="*" /> 可以从一个参数获得,但你必须直接命名属性和参 数: <jsp: set. Property id="local. Name" property="serial. Number" value="string" /> 或者直接用一个名字称和值来设置: <jsp: set. Property id="local. Name" property="serial. Number" value= <%= expression %> />
高级网站设计 2。Java. Bean的使用 万能星(*): <jsp: set. Property name="insertcomuser" property="*"/> 关于Java. Bean 的最后一件事: 为了Web服务器能找到Java. Bean, 你需要将其class类文件放在一个特殊位 置。一般放置在自己站点的WEBINFclasses下。 注意:包的问题!
高级网站设计 3。JSP与Java. Bean结合示例 count. java文件主要内容: package count; public class counter { int count = 0; public counter() { } public int get. Count() { count++; return this. count; } public void set. Count(int count) { this. count = count; } }
高级网站设计 JSP文件mycnter. jsp内容: < HTML> < HEAD> < TITLE> counter < /TITLE> < /HEAD> < BODY> < H 1> JBuilder Generated JSP < /H 1> < jsp: use. Bean id="bean 0" scope="application" class="counter" /> <% out. println("The Counter is : " + bean 0. get. Count() "); %> < /BODY> < /HTML> 下面看另外一个Java. Bean与数据库交互的示例:
高级网站设计
高级网站设计
高级网站设计 思考与练习 1、编写一个Java. Bean,具有属性wid, 其值为welldone。编写jsp文件,输出该 Java. Bean的wid属性的值。 2、编写一个Java. Bean,实现用户登录功 能。若数据库中存在该用户,显示“欢迎 您访问!”,否则显示“您没有权限访问 !” 3、编写一个Java. Bean,实现用户注册功 能。
高级网站设计 3. 3 通用的数据访问Java. Bean 1。动态配置数据源 在WEB-INFclasses下创建init. properties文件, 示例内容如下: #系统配置默认值 conn. JDBC. db. Driver=com. mysql. jdbc. Driver conn. JDBC. db. URL=jdbc: mysql: //localhost/bys conn. JDBC. db. Username=bys conn. JDBC. db. Password=bys 007
高级网站设计 2。读取properties文件的方法 Resource. Bundle rb = Resource. Bundle. get. Bundle("init"); String dirver= rb. get. String("conn. JDBC. db. Driver"); String url= rb. get. String("conn. JDBC. db. URL "); String username= rb. get. String("conn. JDBC. db. Username "); String password= rb. get. String("conn. JDBC. db. Password "); Class. for. Name(dirver); Conncetion conn = Driver. Manager. get. Connection(url, username, password);
高级网站设计 3. 创建comm. JDBC,封装数据访问的常用方法 package dbbeans; public class comm. JDBC { private Connection conn = null; private Statement stmt = null; private Prepared. Statement prepstmt = null; Resource. Bundle rb = Resource. Bundle. get. Bundle("init"); //创建Statement初驶化comm. JDBC public comm. JDBC() { try { Class. for. Name(rb. get. String("conn. JDBC. db. Driver")). new. Instance(); conn = Driver. Manager. get. Connection(rb. get. String("conn. JDBC. db. URL"), rb. get. String("conn. JDBC. db. Username"), rb. get. String("conn. JDBC. db. Password")); stmt = conn. create. Statement(); } catch (Exception e) { System. err. println("comm. JDBC初始化JDBC错误!" ); } }
高级网站设计 //创建Prepared. Statement初驶化comm. JDBC public comm. JDBC(String sql) { try { Class. for. Name(rb. get. String("conn. JDBC. db. Driver")). new. Instance() ; conn = Driver. Manager. get. Connection(rb. get. String("conn. JDBC. db. URL" ), rb. get. String("conn. JDBC. db. Username"), rb. get. String("conn. JDBC. db. Password")); prepare. Statement(sql); } catch (Exception e) { System. err. println("comm. JDBC初始化JDBC错误!" ); } }
高级网站设计 public Connection get. Connection() { return conn; } public void prepare. Statement(String sql) throws SQLException { prepstmt = conn. prepare. Statement(sql); } public Prepared. Statement batch. Statement(String sql) throws SQLException { prepstmt = conn. prepare. Statement(sql); return prepstmt; } public void set. String(int index, String value) throws SQLException { prepstmt. set. String(index, value); } public void set. Int(int index, int value) throws SQLException { prepstmt. set. Int(index, value); }
高级网站设计 public void set. Boolean(int index, boolean value) throws SQLException { prepstmt. set. Boolean(index, value); } public void set. Long(int index, long value) throws SQLException { prepstmt. set. Long(index, value); } public void set. Float(int index, float value) throws SQLException { prepstmt. set. Float(index, value); } public void set. Date(int index, Date value) throws SQLException { prepstmt. set. Date(index, value); }
高级网站设计 public void set. Binary. Stream(int index, Input. Stream in, int length) throws SQLException { prepstmt. set. Binary. Stream(index, in, length); } public void set. Bytes(int index, byte[] value) throws SQLException { prepstmt. set. Bytes(index, value); } public void clearparameters() throws SQLException { prepstmt. clear. Parameters(); } public Prepared. Statement get. Preared. Statement() { return prepstmt; } public Statement get. Statement() { return stmt; }
高级网站设计 //执行statement查询语句 public Result. Set execute. Query(String sql) throws SQLException { if (stmt != null) { return stmt. execute. Query(sql); } else { return null; } } //执行prepared. Statement更新语句 public Result. Set execute. Query() throws SQLException { if (prepstmt != null) { return prepstmt. execute. Query(); } else { return null; } }
高级网站设计 //执行Statement更新语句 public void execute. Update(String sql) throws SQLException { if (stmt != null) { stmt. execute. Update(sql); } } //执行Preapared. Statement更新语句 public int execute. Update() throws SQLException { if (prepstmt != null) { return prepstmt. execute. Update(); } else { return 0; } }
高级网站设计 //添加更新语句块 public void add. Batch(String sql) throws SQLException { prepstmt. add. Batch(sql); } //执行更新语句块 public int[] execute. Batch() throws SQLException { return prepstmt. execute. Batch(); }
高级网站设计 //关闭连接 public void close. DB() { try { if (stmt != null) { stmt. close(); stmt = null; } if (prepstmt != null) { prepstmt. close(); prepstmt = null; } conn. close(); conn = null; } catch (Exception e) { System. err. println("comm. JDBC关闭数据库错误:"); } } }
高级网站设计 4。应用示例 public class insert. Lawsinfo { private final static String sql = "insert into lawsinfo (title, content, issuetime, tag) values (? , ? , ? )"; private String msg = ""; private String title = null; private String content = null; private String tag = null; private Date issuetime = new java. sql. Date(new java. util. Date(). get. Time()); public String get. Title() { return title; } public void set. Title(String title) { this. title = title; } public String get. Content() { return content; } public void set. Content(String content) { this. content = content; } public String get. Tag() { return tag; } public void set. Tag(String tag) { this. tag = tag; }
高级网站设计 public String insert. Lawsinfo() { …… comm. JDBC myconn = new comm. JDBC(sql); try { myconn. set. Bytes(1, this. title. get. Bytes("GBK")); myconn. set. Bytes(2, this. content. get. Bytes("GBK")); myconn. set. Date(3, this. issuetime); myconn. set. String(4, tag); int uprnd = myconn. execute. Update(); …… } catch (Exception e) { …… } finally { myconn. close. DB(); this. title = null; this. content = null; } } …… }}
高级网站设计 第四章 服务器的安装和配置 4. 1 Apache和tomcat的整合使用 1。Apache简介 Apache是一个历史悠久并且功能十分强大的WEB服务器。 快速、可靠、可通过简单的API扩展,完全免费,完全源代码 开放。如果你需要创建一个每天有数百万人访问的Web服务器, Apache可能是最佳选择。Apache 起初由 Illinois 大学 Urbana -Champaign 的国家高级计算程序中心开发。此后,Apache 被开放源代码团体的成员不断的发展和加强。Apache 服务器 拥有牢靠可信的美誉,已用在超过半数的因特网站中-特别是 几乎所有最热门和访问量最大的网站。开始,Apache只是 Netscape网页服务器(现在是Sun ONE)之外的开放源代码 选择。渐渐的,它开始在功能和速度超越其他的基于Unix的 HTTP服务器。1996年 4月以来,Apache一直是Internet上最流 行的HTTP服务器: 1999年 5月它在 57% 的网页服务器上运行; 到了2005年 7月这个比例上升到了69%。 http: //httpd. apache. org/download. cgi
高级网站设计 2。Apache和tomcat的整合 修改Apache的 conf/httpd. conf文件: 步骤一: #Load. Module proxy_module 1. modules/mod_proxy. so # Load. Module proxy_ajp_modules/mod_proxy_ajp. so # Load. Module proxy_balancer_modules/mod_proxy_balancer. so 去掉前面的#号。
高级网站设计 步骤二: # Virtual hosts #Include conf/extra/httpd-vhosts. conf 去掉第二句前面的#号。 步骤三: Proxy. Pass / ajp: //127. 0. 0. 1: 8009/ Proxy. Pass. Reverse / ajp: //127. 0. 0. 1: 8009/ 加在conf/httpd. conf文件末尾 2. 在conf/extra/httpd-vhosts. conf 文件中,添加 :
高级网站设计 <Virtual. Host *: 80> Server. Admin huchg@yahoo. com. cn Proxy. Pass / ajp: //localhost: 8009/ Proxy. Pass. Reverse / ajp: //localhost: 8009/ Server. Name localhost Server. Alias 127. 0. 0. 1 </Virtual. Host>
高级网站设计 4. 2 Tomcat的安全域 1。角色和用户 在conftomcat-users. xml中 加入角色和用户 2。设置安全约束 在web. xml中加入<security-constrain>。 在<security-constrain>中指定 受保护的Web资源以及所有可以访问 该Web资源的角色
高级网站设计 2。设置安全约束 <security-constraint> <display-name>测试网站</display-name> <web-resource-collection> <web-resource-name>Protected Area</webresource-name> <url-pattern>/admin/* </url-pattern> <url-pattern>/*. jsp </url-pattern> </web-resource-collection> <auth-constraint> <role-name>webadmin</role-name> </auth-constraint> </security-constraint>
高级网站设计 2。设置安全约束 在web. xml中加入<login-config>指定验 证类型(基本、摘要、表单) &基本验证BASIC
高级网站设计 2。设置安全约束 &基本验证BASIC <login-config> <auth-method>BASIC</auth-method> BASIC <realm-name>www. ccgg. com/test</realm/test name> </login-config> 注意:用户名和密码传送到Web服务器时,传 送的数据是可读文本,因此本方法不是非常 安全。
高级网站设计 2。设置安全约束 &摘要验证DIGEST
高级网站设计 2。设置安全约束 &摘要验证DIGEST <login-config> <auth-method>BASIC</auth-method> BASIC <realm-name>www. ccgg. com/test</realm/test name> </login-config> 注意:用户名和密码传送到Web服务器时, 传送的数据采用MD 5对用户密码进行加 密,因此本方法比较安全。
高级网站设计 2。设置安全约束 &基于表单的验证 用户可以自定义登录表单的 样式,以及验证失败时的出错页 面。 用户必需提供一个登录表单, 用户名和密码文本框必须命名为 j_username和j_password,且 action必须为j_security_check。
高级网站设计 <login-config> <auth-method>FORM</auth-method> FORM <realm-name>www. ccgg. com/test</realm/test name> <form-login-config> <form-login-page>/login. jsp</form-login-page> <form-error-page>/err. jsp</form-error-page> </form-login-config> </login-config>
高级网站设计 login. jsp文件部分内容: <form method=“post” action=“j_security_check”> 用户名: <input type=“text” name=“j_username”> 密码: <input type=“text” name=“j_password”> <input type=“submit” value=“提交”> </form>
高级网站设计 3。配置<Realm>元素 去掉conf/server. xml中以下语句前的 server. xml 注释 <Realm class. Name="org. apache. catalina. realm. Me mory. Realm" />
高级网站设计 4. 3 Tomcat的JDBC域 1、JDBC域简介(JDBCRealm) 通过JDBC驱动程序访问存放在数据库中的安 全验证信息。这种安全配置非常灵活。 2、JDBC域的配置 F第一步:创建用户角色数据库 两张表,用户表和角色表: Users:username C(10)、password C(8) User_roles:username C(10)、rolename C(8)
高级网站设计 F第二步:配置<Realm>元素 注意:必须将JDBC数据库驱动程序放置在 tomcat的common/lib下,然后在 conf/server. xml中配置<Realm> JDBC驱动程序名 <Realm JDBC连接URL class. Name="org. apache. catalina. realm. JDBCRealm" 连接数据库的用 driver. Name="org. gjt. mm. mysql. Driver" 户名、密码 connection. URL="jdbc: mysql: //localhost/test" 用户表及其字段 名 connection. Name="test" connection. Password="test" 角色表及其字段 user. Table="users" user. Name. Col="username" 名 user. Cred. Col="password" user. Role. Table="userrole" role. Name. Col="rolename" />
高级网站设计 F第三步:在web. xml中配置安全约束 <security-constraint> <display-name>测试网站</display-name> <web-resource-collection> <web-resource-name>Protected Area</web-resource-name> <url-pattern>/userlogin. jsp</url-pattern> </web-resource-collection> <auth-constraint> <role-name>friend</role-name> </auth-constraint> </security-constraint>
高级网站设计 <login-config> <auth-method>DIGEST</auth-method> <realm-name>www. ccgg. com/test</realmname> </login-config> <security-role> <description>roles</description> <role-name>friend</role-name> </security-role>
高级网站设计 4. 4 Tomcat的Data. Source域 1、Data. Source域简介(连接池) 与JDBCRealm域相似,都将安全验证信息 存放在关系型数据库中,且数据库结构相同。 但是访问数据库方式不一样。Data. Source通 过JNDI Data. Source访问数据库,而 JDBCRealm通过JDBC驱动程序访问数据库。 2、JDBC域的配置 F第一步:创建用户角色数据库 两张表,用户表和角色表。与前面 JDBCRealm相同。
高级网站设计 F第二步:创建Data. Source。 在conf/server. xml的<Global. Naming. Resources>中 配置: 配置 <Global. Naming. Resources> … <Resource name="jdbc/mydb" type="javax. sql. Data. Source" username="root" password="cg" driver. Class. Name="org. gjt. mm. mysql. Driver" url="jdbc: mysql: //localhost/test" max. Idle="30" max. Wait="5000" max. Active="100"/> </Global. Naming. Resources>
高级网站设计 参数说明: drive. Class. Name:JDBC驱动类的名称 user:连接数据库的用户名; password:连接数据库的用户密码; url:连接数据库的JDBC的URL连接; max. Active:同时能够从连接池中被分配的 可用实例的最大数; max. Idle:可以同时闲置在连接池中的连接 的最大数; max. Wait:最大超时时间,以毫秒计;
高级网站设计 F第三步:在conf/server. xml中加入如下 <Realm>元素。 <Realm class. Name="org. apache. catalina. realm. Data. Source. Realm" debug="99" data. Source. Name="jdbc/mydb" user. Table="users" user. Name. Col="username" user. Cred. Col="password" user. Role. Table="userrole" role. Name. Col="rolename" />
高级网站设计 4. 5 在Tomcat中配置SSL 1。认识SSL 在网络上信息在源-宿的传递过程中会经过其它的 计算机。通常中间的计算机不会监听路过的信息。但 在使用网上银行或者进行信用卡交易的时候有可能被 监视,从而导致个人隐私的泄露。由于Internet和 Intranet体系结构的原因,总有某些人能够读取并替 换用户发出的信息。随着网上支付的不断发展,人们 对信息安全的要求越来越高。因此Netscape公司提出 了SSL(Server Socket Layer)协议,旨在达到在开放 网络(Internet)上安全保密地传输信息的目的,这种协 议在WEB上获得了广泛的应用。 之后IETF(ietf. org) 对SSL作了标准化,并将其称为TLS(Transport Layer Security),从技术上讲,TLS 1. 0与SSL 3. 0的 差别非常微小。
高级网站设计 2。SSL 作原理 SSL协议使用不对称加密技术实现会话 双方之间信息的安全传递。可以实现信息传 递的保密性、完整性,并且会话双方能鉴别 对方身份。不同于常用的http协议,我们在与 网站建立SSL安全连接时使用https协议,即 采用https: //ip: 8443/的方式来访问。当我们与 一个网站建立https连接时,我们的浏览器与 Web Server之间要经过一个握手的过程来完 成身份鉴定与密钥交换,从而建立安全连接。 具体过程如下:
高级网站设计 原始数据 加密 解密 原始数据 网络 原始数据 解密 加密 原始数据
高级网站设计
高级网站设计
高级网站设计 3。安全证书 除了对数据加密以外,SSL采用身份认证机制。 获取安全证书有两种途径: *从权威机构获得 国际权威的证书机构(CA,Certificate Authority)如 Veri. Sign(www. verisign. com)和 Thawte(www. thawte. com)颁发。一个安 全证书只对一个IP地址有效。需要支付费 用。 *创建自我签名证书 可以利用keytool创建自我签名证书
高级网站设计 4。配置SSL %第一步:准备安全证书 SUN公司在JDK 1. 4以上版本中提供了制作自我签名的 具,即binkeytool. exe。命令格式为: keytool -genkey -alias tomcat -keyalg RSA –keystore c: mypath. keystore -genkey:生成密钥对 -alias:指定密钥的别名,该别名是公开的 -keyalg:指定加密算法,通常采用RSA加密算 法 -keystore:指定证书文件的存放位置
高级网站设计 %第二步:配置SSL连接器 在confserver. xml中配置: <Connector port="8443" max. Http. Header. Size="8192" 8443 max. Threads="150" min. Spare. Threads="25" max. Spare. Threads="75" enable. Lookups="false" disable. Upload. Timeout="true" accept. Count="100" scheme="https" secure="true" client. Auth="false" ssl. Protocol="TLS" keystore. File="f: /sslkey/. keystore" keystore. Pass=“cg"/> =“cg"
高级网站设计 %第三步:访问支持SSL的站点 https: //localhost: 8443/jsptest 5。SSL的缺点 SSL速度较慢。除非安全性要求 较高,一般站点不要使用SSL。
高级网站设计 思考与练习 1、实现Apache和tomcat的整合使用 2、配置一个站点,对其中的admin子文件 夹下的所有文件分别用基本验证、摘要 验证、表单验证进行保护。 3、利用JDBC域实现用户登录功能。 4、利用连接池,实现用户登录功能。 5、如何实现站点某一个指定文件夹的 SSL保护,例如mysite站点,只用SSL 保护其下的admin文件夹?
高级网站设计 第五章 Web高级应用 5. 1 文件操作 1。File文件对象 File是File(String) java. io包的一部分, 它代表一个文件或文件夹的引用。格式: 创建一个File对象,如果没有指定文件名, 则创建一个文件夹。例如: File myfile=new File(“d: counter. txt”); 常用方法:exists()、delete()、mkdir()
高级网站设计 2。读取文本文件 v. File. Reader 读取字符流,逐个字符读取,格式: File. Reader txt=new File. Reader(文件名) 例如: File. Reader txt=new File. Reader(“counter. txt”)
高级网站设计 v. Buffered. Reader 读取字符输入流,一次读取一行,格式: Buffered. Reader buff=new Buffered. Reader(Reader); 例如: Buffered. Reader buff=new Buffered. Reader(new File. Reader(“counter. txt”)); buff. close(); 注意: Buffered. Reader读取字符输入流, 并高效率的缓存起来。
高级网站设计 3。写入文本文件 Buffered. Writer写入一个带缓冲的字符流。格 式: Buffered. Writer(File. Writer) 例如: File tmpf=new File(“d: xy. txt”); Buffered. Writer outf = new Buffered. Writer(new File. Writer(tmpf)); outf. write(“ 123”); outf. close();
高级网站设计
高级网站设计 文件操作示例 第一章思考与练习 7:如何编写listener Servlet,实现 计数器功能? package listener; import javax. servlet. *; import javax. servlet. http. *; import java. io. Buffered. Reader; import java. io. File; import java. io. Buffered. Writer; import java. io. File. Writer;
高级网站设计 public class listener. Servlet extends Http. Servlet implements Servlet. Context. Listener, Servlet. Context. Attribute. Listener, Http. Session. Listener, Http. Session. Attribute. Listener { private Servlet. Context context = null; private int onlinevistor=0; //Notification that the web application is ready to process requests public void context. Initialized(Servlet. Context. Event sce) { this. context=sce. get. Servlet. Context(); context. set. Attribute("onlinevisitor", new Integer(this. onlinevistor)); }
高级网站设计 //Notification that the servlet context is about to be shut down public void context. Destroyed(Servlet. Context. Event sce) { this. context = null; this. session. Created(new Http. Session. Event((Http. Session)this)); }
高级网站设计 //Notification that a session was created public void session. Created(Http. Session. Event se) { this. onlinevistor++; context. set. Attribute("onlinevisitor", new Integer(this. onlinevistor)); try { String filestr=context. get. Real. Path("/incfiles")+"/counter. dat"; Buffered. Reader buff=new Buffered. Reader(new File. Reader(filestr)); long tmp; String line; line=buff. read. Line(); tmp=Long. parse. Long(line); tmp++;
高级网站设计 Long tmpint=new Long(tmp); context. set. Attribute("visitor", tmpint); String counter=tmpint. to. String(); File tmpf=new File(filestr); Buffered. Writer outf = new Buffered. Writer(new File. Writer(tmpf)); outf. write(counter); outf. close(); buff. close(); } catch (Exception e) { System. err. println("无法更新计数器:"+e); } }
高级网站设计 //Notification that a session was invalidated public void session. Destroyed(Http. Session. Event se) { this. onlinevistor--; context. set. Attribute("onlinevisitor", new Integer(this. onlinevistor)); } }
高级网站设计 4。文件输入流 流(Stream)是一个将数据从一个地 方运送到另一个地方的一个对象。输入 流格式: File. Input. Stream in. Stream=new File. Input. Stream(String); 例如: File. Input. Stream in. Stream=new File. Input. Stream(“d: mylet. zip”);
高级网站设计 5。输出流 Output. Stream to. Client = response. get. Output. Stream(); 例如: Output. Stream to. Client = response. get. Output. Stream(); to. Client. flush(); to. Client. close();
高级网站设计 流的应用示例-文件下载的实现
高级网站设计 package bysservlet; import javax. servlet. *; import javax. servlet. http. *; import java. io. *; public class download extends Http. Servlet { private static final String CONTENT_TYPE = "text/html; charset=GB 2312";
高级网站设计 public void service(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. set. Buffer. Size(20000); //有什么作用??? Print. Writer out = response. get. Writer(); response. set. Content. Type(CONTENT_TYPE); request. set. Character. Encoding("GBK"); //下载路径 String filepath = request. get. Parameter("fpath"); if (filepath == null) { filepath = ""; } //文件名称 String filename = request. get. Parameter("fname"); if (filename == null) { filename = ""; }
高级网站设计 String dir. Name=get. Servlet. Context(). get. Real. Path("/"+filepath); java. io. File ff=null; String dd=dir. Name+System. get. Properties(). get. Property("file. separator")+fi lename; try{ ff=new java. io. File(dd); } catch(Exception e){ out. println(“出错!”); }
高级网站设计 if (ff!=null&&ff. exists()&&ff. is. File()) { long filelength = ff. length(); File. Input. Stream in. Stream=new File. Input. Stream(dd); response. reset(); response. set. Content. Type("application/x-msdownload; charset=GBK"); response. set. Content. Length((int)filelength); response. set. Header("Content. Disposition", "attachment; filename=""+filename+"""); Output. Stream to. Client = response. get. Output. Stream(); byte[] bzp = new byte[102400]; int i; while ( (i = in. Stream. read(bzp)) != -1) { to. Client. write(bzp, 0, i); } to. Client. flush(); to. Client. close(); } } }
高级网站设计 5. 2 Cookie的管理 Cookie是服务器在用户硬盘上存放的信息。 1。创建Cookie my. Cookie=new Cookie(“cookie. Name”, ”cookie. Value”); Response. add. Cookie(my. Cookie); 例如: Cookie vname=new Cookie(“usrname”, ”Tom”); response. add. Cookie(vname);
高级网站设计 2。获取Cookie cookies[]=request. get. Cookies(); 然后调用Cookie的get. Name()获取Cookie的key, 调用get. Value()获取Cookie的Value。例如: Cookie[] mycookie=request. get. Cookies(); for(Int i=0; i< mycookie. length; I++) { out. println(”Cookie的名称:”+ mycookie[i]. get. Name() ); out. println(”Cookie的值:”+ mycookie[i]. get. Value() ); }
高级网站设计 5. 4 页面缓存 缓存是一种用于提高系统性能节省操作时间的技 术,数据库产品利用它可以提高系统的吞吐率,服务 器利用它可以提高性能。缓存是将响应内容临时保存 在服务器的内存中,然后在请求处理完毕之后发回给 所调用的浏览器。在Web应用程序中,提高系统性能 最有效的手段是在需要时缓存页面的输出。 在JSP页面最好使用输出缓存功能。缓存设置方法: Ì采用JSP标记 通常情况下,默认缓存大小为 8 KB。缓存设置格式: <%@ page buffer="8 kb"%> 在大多数Web应用程序中,缓存大小至少应为 32 kb,牺 牲这么一点额外的内存是很值得的。
高级网站设计 Ì采用定制标记 Oscache:免费的开放源缓存定制标记,下载 地址: https: //oscache. dev. java. net/servlets/Project Document. List Weblogic:著名的BEA Weblogic Server提供 的标记库,包含一个名为wl: cache的缓存定 制标记。其网站: http: //dev 2 dev. bea. com. cn/index. jsp Weblogic与其它开放源的页面缓存标记使用磁 盘存储器不同,Weblogic利用系统的内存空 间,可以获得最佳性能。
高级网站设计 ÌWeblogic的wl: cache使用 v步骤一:将weblogic-tags. jar拷贝到站 点的WEB-INFlib下。 v步骤二:在web. xml中添加如下内容: <taglib> <taglib-uri>weblogic-tags. tld</taglib-uri> <taglib-location>/WEB-INF/lib/weblogictags. jar</taglib-location> </taglib>
高级网站设计 v步骤三:在JSP页面中使用wl: cache 格式: <wl: cache name=“…” scope=“…” timeout=“…” > …. </wl: cache> scope:application、session、page 注意:必须在JSP文件头使用<%@ taglib uri=“weblogic-tags. tld” prefix=“wl”%>语 句
高级网站设计 示例: <%@ taglib uri="weblogic-tags. tld" prefix="wl"%> <html> <body> 当前时间:<%=System. current. Time. Millis()%> <wl: cache timeout="60 s"> 缓存时间: <%=System. current. Time. Millis()%> </wl: cache> </body> </html>
高级网站设计 5. 5 使用Hibernate进行数据持久化 5. 5. 1 Hibernate简介 Hibernate是一个开源的对象关系映射框架,负责Java对象和关系数据 之间的映射,是Java应用和关系数据库之间的桥梁。Hibernate对JDBC进行 了轻量级的对象封装,其内部封装了通过JDBC访问数据库的操作,并向上 层应用提供了面向对象的数据访问API。Hibernate可以应用在任何使用 JDBC的场合, 既 可 以 在 Java的 客 户 端 程 序 使 用 , 也 可 以 在 Servlet/JSP等 Web应用中使用,担当数据持久化的重任。这样一来,开发人员不用再写 繁琐的SQL语句,Hibernate自动帮我们生成,也不用考虑如何从数据库中 取出或保存数据,Hibernate包办了。一句话,与数据库打交道变得轻松了 ! Hibernate是一个出生于民间的草根英雄。不像有些数据库持久化技术, 背后有大公司支撑。Hibernate只是一个热爱Java的程序员Gavin King于2001 年催生的,而且更新速度很快。2003年 6月,Hibernate 2发布,并被 javaworld评选为 2003年度最佳java数据存取 具。2005年 3月,Hibernate 数据存取 具 3发布,更是受到了空前关注。现在,Hibernate已经成为著名开源组织 JBoss的子项目之一。 的子项目之一
高级网站设计 Hibernate的优势在哪儿? v轻量级封装。 v开发效率高。 v开发者活跃。 v开源和免费。 v分布式、可扩展。
高级网站设计 5. 5. 2 Hibernate 作流程 Java应用程序 Business Service 实体类 Hibernate API XML映射文件 Hibernate配置 数据库服务器 数据表
高级网站设计 5. 5. 3 Hibernate下载安装 Hibernate官方下载网址为http: //www. hibernate. org/,如图 http: //www. hibernate. org/ 所示,目前最新版本为 3. 2. 1。该网站同时提供了一些辅助 具 和相关文档资料。
高级网站设计. 5. 5. 4 Hibernate查询语言SQL (1) from子句返回类的实例。格式:from 类名。 (2) select子句返回类的指定对象或属性。格式:select 对象/属性 from类名。 (3) where子句返回指定范围的实例。格式:where <条件> (4) order by子句将查询返回的列表按照指定属性进行排序,asc为升序,desc为降序。格式: order by 属性asc/desc。例如:from Student where zy=’电子商务’ order by cet 4 desc。 (5) group by子句 group by子 句 , 将 查 询 返 回 的 列 表 按 照 指 定 属 性 进 行 分 组 。 例 如 : select Student. xh, Student. xm, Student. nl, Student. zy from Student student group by zy。 (6) Query查询 Query用于执行查询并返回结果。例如: String hql="from Users where username=: user and password=: pwd"; Query query=session. create. Query(hql); query. set. String("user", "tom"); query. set. String("pwd", "007"); List list=query. list(); 程序说明:hql查询语句需要传递两个参数user、pwd,示例中向其分别传递了tom和007作为 参数值。查询结果封装到List集合中。
高级网站设计 5. 5. 5 Hibernate配置文件hibernate. cfg. xml 下面是一个比较常见的hibernate. cfg. xml配置文件的内容: <? xml version="1. 0" encoding="utf-8"? > <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate Configuration DTD//EN" "http: //hibernate. sourceforge. net/hibernate-configuration-3. 0. dtd"> <hibernate-configuration> <session-factory> <!-- local connection properties --> <property name="hibernate. connection. url">jdbc: mysql: //localhost/booktest</property> <property name="hibernate. connection. driver_class">com. mysql. jdbc. Driver</property> <property name="hibernate. connection. username">tom</property> <property name="hibernate. connection. password">rcp</property> <!-- dialect for My. SQL --> <property name="dialect">org. hibernate. dialect. My. SQLDialect</property> <property name="hibernate. show_sql">true</property> <property name="hibernate. transaction. factory_class"> org. hibernate. transaction. JDBCTransaction. Factory </property> <mapping resource="test/model/Student. hbm. xml" /> </session-factory> </hibernate-configuration>
高级网站设计 5. 5. 6 Configuration类负责管理Hibernate配置信息,其实例 代表了应用程序中Java类到数据库的映射集合。通 过Configuration的实例,Hibernate将构造一个 Session. Factory实例并绑定基于hibernate. cfg. xml的 配置信息。 如果使用默认配置文件hibernate. cfg. xml,则可以这 样获得Configuration的实例: Configuration config=new Configuration(). configure(); 如果希望使用特定的配置文件,例如 hibernate_derby. cfg. xml,则可以这样: Configuration config=new Configuration(). configure("hibernate_mysql. cfg. xml ");
高级网站设计 5. 5. 7 Session和Session. Factory Hibernate之所以能够将实体对象和数据库连接,离不 开非常重要的Session对象。Session是Hibernate持 久化的基础,应用程序通过Session与数据库交互。 需要注意的是,Session与JSP中的session有很大 差别,没有任何关系。 Session. Factory负责创建Session实例,下面是创建 Session的示例代码: Configuration config=new Configuration(). configure(); Session. Factory sf =config. build. Session. Factory(); Session session=sf. open. Session(); 然后就可以调用session的各种方法完成数据库持久化 操作。
高级网站设计 5. 5. 8 Hibernate映射文件的作用就在于告诉Hibernate应该访问哪个数据库的哪个表以及哪些字段, 这样Hibernate才能够将类的对象持久化到数据库的数据表。下面是一个示例: <? xml version="1. 0"? > <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD//EN" "http: //hibernate. sourceforge. net/hibernate-mapping-3. 0. dtd" > <hibernate-mapping package="test. model"> <class name=" Users " table="users"> <meta attribute="sync-DAO">false</meta> <id name="Id" type="integer" column="id"> <generator class="identity"/> </id> <property name="Username" column="username" type="string"/> <property name="Password" column="password" type="string"/> </class> </hibernate-mapping>
高级网站设计 5. 5. 9 Hibernate牛刀小试 (1) 启动My. SQL。 (2)生成Hibernate配置文件hibernate. cfg. xml。。 注意,务必将hibernate. cfg. xml文件放置在项目 src文件夹下,以避免不必要的麻烦。 (3)生成映射文件。在src下新建包test. model, 单击鼠标右键,选择【New】→【Other…】→ 【Hibernate】→【Hibernate Mapping File】 (4)在hibernat. cfg. xml文件中添加Users. hbm. xml 映射。 (5)生成Java文件。
高级网站设计 (6)编写测试程序 public void service(Http. Servlet. Request request, Http. Servlet. Response response) throws Servlet. Exception, IOException { response. set. Content. Type("text/html"); Print. Writer out = response. get. Writer(); try { Session. Factory sf = new Configuration(). configure(). build. Session. Factory(); Session session = sf. open. Session(); Transaction tx = session. begin. Transaction(); Users users= new Users(); users. set. Username("007"); users. set. Password("1234567"); session. save(users);
高级网站设计 tx. commit(); session. close(); out. println("sucess"); }catch (Hibernate. Exception e) { out. print(e); } out. flush(); out. close(); }
300cd35c7e6ff8d49c5dfdb51d14ff77.ppt