Lab8设计实现留言板 实验目的 1)复习MVC设计模式 2)复习 serlvet/jsp 3)熟练掌握JDBC连接 MySQL 4)熟练掌握 MySQL的操作 5)熟练掌握处理各种关于中文的乱码显示问题 实验任务 通过设计JSP、 Servlet、 JavaBean使用MvC模式实现留言的添加、删除和修改,页面中留 言的添加、删除和修改通过 servlet实现,页面显示留言内容通过JSP访问 JavaBean实现, 在JSP页面中使用JSTL,不能出现Java代码片段。留言包括用户名、标题、留言日期、留 言时间以及内容,其中相关信息可以使用中文;添加和修改留言时只显示用户名、标题、留 言内容,留言日期和留言时间在 servlet中由程序生成。留言内容通过 JavaBean存入MySq1 中建立的表中。本实验中MC的组成如下: M package: bean 定义消息的内容以及操作 messageD.java定义与消息有关的数据库操作 v index. jsp 主页面,显示当前所有留言 Info. jsp 添加和修改消息的页面 C package: filte CharacterEncodingfilter.java过滤器 Package: servlet MsgProcess. java 处理留言的添加、修改和删除 实验环境 数据库 MySQL5 开发工具不限(推荐 My Eclipse) Servlet/JSP容器: Apache Tomcat5.5或以上 JDK:Sun顶DK1.5或以上 浏览器: Internet Explorer6或以上, Firefox1.5或以上 实验提交物 本次试验需要在5:00之前让TA检查,记录,上传所有源码文件以及WAR文件 实验步骤
Lab 8 设计实现留言板 实验目的 1) 复习 MVC 设计模式 2) 复习 serlvet/jsp 3) 熟练掌握 JDBC 连接 MySQL 4) 熟练掌握 MySQL 的操作 5) 熟练掌握处理各种关于中文的乱码显示问题 实验任务 通过设计 JSP、Servlet、JavaBean 使用 MVC 模式实现留言的添加、删除和修改,页面中留 言的添加、删除和修改通过 servlet 实现,页面显示留言内容通过 JSP 访问 JavaBean 实现, 在 JSP 页面中使用 JSTL,不能出现 Java 代码片段。留言包括用户名、标题、留言日期、留 言时间以及内容,其中相关信息可以使用中文;添加和修改留言时只显示用户名、标题、留 言内容,留言日期和留言时间在 servlet 中由程序生成。留言内容通过 JavaBean 存入 MySql 中建立的表中。本实验中 MVC 的组成如下: M package:bean message.java 定义消息的内容以及操作 messageDB.java 定义与消息有关的数据库操作 V index.jsp 主页面,显示当前所有留言 Info.jsp 添加和修改消息的页面 C package: filter CharacterEncodingFilter.java 过滤器 Package: servlet MsgProcess.java 处理留言的添加、修改和删除 实验环境 数据库 MySQL 5 开发工具 不限(推荐 MyEclipse) Servlet/JSP 容器:Apache Tomcat 5.5 或以上 JDK:Sun JDK 1.5 或以上 浏览器:Internet Explorer 6 或以上,Firefox 1.5 或以上 实验提交物 本次试验需要在 5:00 之前让 TA 检查,记录,上传所有源码文件以及 WAR 文件 实验步骤
1.中文乱码问题 乱码问题是由于未对中文进行特殊的编码处理,由于编码可采用不同的编码方式,包括 TF-8、GBK、GB2312都是支持中文的,本实验中统一采用UTF-8 1)JSP页面中文乱码解决方法 在各个JSP页面中加入如下 <o page language=java"import="java util. pageEncoding="UTF-8"8> 2)表单提交中乱码解决方法 使用 filter解决,过滤器的基本原理就是对于每一个用户请求,都必须经过过滤器的处 理才能继续发生到目的页面中。在JSP中,以POST方式提交的表单本质上就是封装 request对象中的,而 request对象是必须要经过过滤器的处理的,所以对于中文乱码问 题,可以在 filter中对所有的请求进行编码格式的处理 文件 CharacterEncodingFilter.java为中文处理过滤器,通过继承Fltr类实现。 过滤器实现处理中文的方式为 a)在初始化函数init中加载配置文件中定义的编码类型,具体方法为: Eilterconfig filterconfig;/定义成员变量 String encodingName;//定义成员变量 boolean enable;//定义成员变量 this encodingName this filterConfig. getInitParameter("encoding") String strIgnoreFl this. filterConfig. getInitParameter("enable") if(strIgnoreFlag.equalsIgnorecase("true"))( this enable true else this enable false b)在 dofilter函数中实现过滤中文 i£(this. enable) request setcharacterEncoding(this. encodingName)i chain. doFilter (request, response) c)修改配置文件,在web- inf/web.xml文件中添加如下配置信息 <filter> <filter-class>filter. CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <init-param> <param-name >enable</param-name> <param-value>true</param-value> </init-param>
1.中文乱码问题 乱码问题是由于未对中文进行特殊的编码处理,由于编码可采用不同的编码方式,包括 UTF-8、GBK、GB2312 都是支持中文的,本实验中统一采用 UTF-8。 1) JSP 页面中文乱码解决方法 在各个 JSP 页面中加入如下 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2) 表单提交中乱码解决方法 使用 filter 解决,过滤器的基本原理就是对于每一个用户请求,都必须经过过滤器的处 理才能继续发生到目的页面中。在 JSP 中,以 POST 方式提交的表单本质上就是封装 request 对象中的,而 request 对象是必须要经过过滤器的处理的,所以对于中文乱码问 题,可以在 filter 中对所有的请求进行编码格式的处理。 文件 CharacterEncodingFilter.java 为中文处理过滤器,通过继承 Filter 类实现。 过滤器实现处理中文的方式为: a) 在初始化函数 init 中加载配置文件中定义的编码类型,具体方法为: FilterConfig filterConfig;//定义成员变量 String encodingName; //定义成员变量 boolean enable; //定义成员变量 this.encodingName = this.filterConfig.getInitParameter("encoding"); String strIgnoreFlag = this.filterConfig.getInitParameter("enable"); if(strIgnoreFlag.equalsIgnoreCase("true")){ this.enable = true; } else{ this.enable = false; } b) 在 doFilter 函数中实现过滤中文 if(this.enable){ request.setCharacterEncoding(this.encodingName); } chain.doFilter(request, response); c) 修改配置文件,在 web-inf/web.xml 文件中添加如下配置信息 <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>enable</param-name> <param-value>true</param-value> </init-param> </filter>
<filter-mapping> <filter-name >CharacterEncodingFilter</filter-name> </filter-mapping> 3)数据库乱码解决方法 在 Mysql中建立数据库和表示统一使用UTF8编码 数据库建立连接时使用UTF-8编码 jdbc: mysql: //xx xx xxxx: 3306/lab9?user=xx&password=xx&useUnicode =true&characterEncodingsutf-8 注: XXXXXXXX为所访问 MySql的IP 2.建立数据库 在 MySQL中建立数据库lab9,使用uf8编码; CREATE DATABASE lab9 CHARACTER SET utf8 COLLatE utf8 general ci 在此数据库下建立表 message,使用uft8编码 CREATE TABLE message( Id int(11)NOT NULL auto increment, userName varchar(20)default NULL varchar(20)default NU time varchar(20)default NULL itle varchar(20)default NULL contentvarchar(255) default NULL PRIMARY KEY CId) ENGINE=MyISAM AUTO INCREMENT=13 DEFAULT CHARSET=utf8 3.数据库的连接与操作 首先定义留言的实体Bean,创建包bean,并在此包中新建文件 message.java,此实体bear 对于操作数据库皿 essage表的六个字段 Id. userName, date, time, title, content 提供相应的set和get方法,由于id字段在表中定义的是自增的,故在此实体中不提供id的set 方法。 数据库的操作在独立的Bean中定义,数据库连接通过JDBC连接,需要第三方库的支持,此库 有TA在ftp上提供,下载后,将 mysql- connec tor-java-5.0.5-bin.jar保存到\WB-INF\1 目录下 在bean包中新建文件皿 essageDB.java,用于操作数据库,实现留言的增加、删除、修改以及 査询。以下给出此文件的代码,阴影部分需要同学们根据提示补全
<filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 3) 数据库乱码解决方法 在 MySql 中建立数据库和表示统一使用 UTF-8 编码。 数据库建立连接时使用 UTF-8 编码: "jdbc:mysql://xx.xx.xx.xx:3306/lab9?user=xx&password=xx&useUnicode =true&characterEncoding=utf-8"; 注:xx.xx.xx.xx 为所访问 MySql 的 IP 2. 建立数据库 在 MySQL 中建立数据库 lab9,使用 uft8 编码; CREATE DATABASE `lab9` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; 在此数据库下建立表message, 使用uft8编码; CREATE TABLE `message` ( `Id` int(11) NOT NULL auto_increment, `userName` varchar(20) default NULL, `date` varchar(20) default NULL, `time` varchar(20) default NULL, `title` varchar(20) default NULL, `content` varchar(255) default NULL, PRIMARY KEY (`Id`) ) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; 3. 数据库的连接与操作 首先定义留言的实体Bean,创建包bean,并在此包中新建文件message.java,此实体bean 对于操作数据库message表的六个字段 Id, userName, date, time, title, content 提供相应的set和get方法,由于id字段在表中定义的是自增的,故在此实体中不提供id的set 方法。 数据库的操作在独立的Bean中定义,数据库连接通过JDBC连接,需要第三方库的支持,此库 有TA在ftp上提供,下载后,将mysql-connector-java-5.0.5-bin.jar保存到\WEB-INF\lib 目录下 在bean包中新建文件messageDB.java,用于操作数据库,实现留言的增加、删除、修改以及 查询。以下给出此文件的代码,阴影部分需要同学们根据提示补全
package bean import java. sql Connecti import java. sql DriverManager import java. sql Resultset import java. sql Statement 1mp import java. util. Collection; import java.util. List public class messageDB t civate message msgi private List<message> msgs Connection conn statement stat Resultset rs public messageD ()I new Arraylist<message>( msg new message()i roid openD()( String ur1=定义连接方式 Class forName("com mysql jdbc Driver")i
package bean; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class messageDB{ private message msg; private List<message> msgs; Connection conn; Statement stat; ResultSet rs; public messageDB(){ msgs = new ArrayList<message>(); msg = new message(); } void openDB(){ String url = try { Class.forName("com.mysql.jdbc.Driver"); 定义连接方式
catch (ClassNot FoundException e) i cy this, conn iverManager. getConnection(url)i y catch (SQLException e)( e printstackTrace() y catch (SQLException e) t e printstackTrace() //此函数返回当前 message表中所有留言记录到一个链表中,用于显示 打开数据库 String sql 数据库查询语句 try i while(rs next() str str replace("\r\n","<br>") //System. out. print (str) rs getstring(3), / TODO Auto-generated catch block
} catch (ClassNotFoundException e) { e.printStackTrace(); } try { this.conn = DriverManager.getConnection(url); stat = conn.createStatement(); } catch (SQLException e) { e.printStackTrace(); } } void closeDB(){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //此函数返回当前message表中所有留言记录到一个链表中,用于显示 public List getMsgs(){ String sql = try { rs = stat.executeQuery(sql); while(rs.next()){ String str = rs.getString(6); str = str.replace("\r\n", "<br>"); //System.out.print(str); msg = new message(rs.getInt(1),rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5),str); msgs.add(msg); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { if(rs!=null) rs.close(); if(stat !=null) stat.close(); 数据库查询语句 打开数据库