11_JSP/Servlet的综合应用
2012-12-18 13:36
513 查看
11.1 网站计数器
示例11-1:实现网页计数器的JSP
源文件:counter.jsp
11.2 JavaMail
示例11-2:邮件编写页面
源文件:send.html
示例11-3:读取文本框数据并发送邮件的JSP
源文件:sendmail.jsp
示例11-4:发送HTML格式的邮件
源文件:sendhtmlmail.jsp
11.3 分页显示
通常可以采用两种策略来实现分页:
基于缓存(Cache-Based):一次性将记录都取出
基于查询(Query-Based):当需要的时候查询
11.3.1 基于缓存的分页策略
示例11-5:处理数据库访问的JavaBean
源文件:CachedPageBean.java
示例11-6:分页的JSP代码
源文件:cachePages.jsp
11.3.2 基于查询的分页策略
示例11-7:处理数据库访问的JavaBean
源文件:QueryPageBean.java
示例11-8:分页的JSP代码
源文件:queryPage.jsp
11.4 文件上传
示例11-9:上传文件的表单
源文件:uploadForm.html
示例11-10:处理文件上传
源文件:uploadFile.jsp
11.5 Web应用程序的国际化
示例11-11:定义资源文件
源文件:HelloResource_zh_CN.properties
源文件:HelloResource.properties
示例11-12:实现国际化的JSP程序
示例11-13:在Servlet中实现国际化
源文件:Hello.java
11.6 DAO(Data Access Object)模式
11.6.1 DAO模式
1.MVC中Controller用Servlet实现,Servlet需要连接数据库,取得数据,封装到JavaBean中,将Servlet中和数据相关的部分单独出来,也就是DAO模式。
2.DAO实现了用来操作数据源的访问机制,数据源可以是RDBMS,LDAP,File,底层socket等。
3.DAO充当了组件和数据源之间的适配器。
11.6.2 Factory/abstract Factory模式
1.简单工厂(Simple Factory)模式,也就是根据指定的参数返回某个类的实例。
2.抽象类StudentDAO有一个抽象方法createStudent(),然后实现它的不同类既可以操作不同的数据库。
11.6.3 DAO+Abstract Factory模式的实例
涉及到的类有:DAOFactory,OracleDAOFactory,StudentDAO,OracleStudentDAO,Student。
DAOFactory可以得到得到StudentDAO,并且是各dbDAOFactory的父类;
OracleDAOFactory是DAOFactory的子类,负责连接oracle数据库,以及返回使用oracle操作student的StudentDAO;
StudentDAO,负责通过各数据库具体的操作student;
OracleStudentDAO,StudentDAO的子类,通过oracle数据库操作student;
Student,student的JavaBean。
示例11-14:抽象工厂类
源文件:DAOFactory.java
示例11-15:针对Oracle的工厂类
源文件:OracleDAOFactory.java
示例11-16:用于操作Student表的DAO接口
源文件:StudentDAO.java
示例11-17:在Oracle中操作Student表的DAO类实现
源文件:OracleStudentDAO.java
示例11-18:Student的JavaBean类
源文件:Student.java
11.7 中文乱码问题
11.7.1 字符编码
包括:ASCII,ISO8859,GB2312,GBK,UNICODE,UTF-8
11.7.2 乱码产生的原因
11.7.3 乱码解决方案
1.JSP页面最基本的乱码问题
代码:
其中:
一般将以上三处都写为utf-8编码格式。
2.表单使用POST方式提交后接收到的乱码问题
示例11-19:过滤器解决乱码
源文件:SetCharacterEncodingFilter.java
源文件:web.xml
3.表单使用GET方式导致乱码的处理方式
4.数据库中读取和存储中文时的乱码问题
示例11-1:实现网页计数器的JSP
源文件:counter.jsp
<%@ page language="java" import="java.util.*,java.io.*" %> <%@ page contentType="text/html; charset=GBK" pageEncoding="GBK" %> <%! int counter = 1; String file = "e:\\counter.txt"; BufferedReader br = null; PrintWriter pw = null; public void add(){ File f = new File(file); String s = ""; try{ if(!f.exists()){ counter = 1; pw = new PrintWriter(new FileWriter(file)); pw.println(counter); pw.close(); }else{ br = new BufferedReader(new FileReader(file)); s = br.readLine(); int i = Integer.parseInt(s); counter = i + 1; br.close(); pw = new PrintWriter(new FileWriter(file)); pw.println(counter); pw.close(); } }catch(Exception e){} } %> <% add(); %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> 您是本站第<%= counter %>位贵宾! </body> </html>
11.2 JavaMail
示例11-2:邮件编写页面
源文件:send.html
<!DOCTYPE html> <html> <head> <title>send mail</title> <meta http-equiv="content-type" content="text/html; charset=GBK"> </head> <body> <form action="D03_sendmail.jsp" method="post"> <table> <tr> <td> To:<br /> <input name="to" size="25" type="text" /> </td> <td> From:<br /> <input name="from" size="25" type="text" /> </td> </tr> <tr> <td colspan="2"> 主题:<br /> <input name="title" size="50" type="text" /> </td> </tr> <tr> <td colspan="2"> 内容:<br /> <textarea name="text" rows="10" cols="70"></textarea> </td> </tr> </table> <input type="submit" name="send" value="发送" /> <input type="reset" name="reset" value="重置" /> </form> </body> </html>
示例11-3:读取文本框数据并发送邮件的JSP
源文件:sendmail.jsp
<%@ page language="java" import="javax.mail.*,javax.mail.internet.*,javax.activation.*,java.util.*" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <% try{ Properties props = new Properties(); Session sendMailSession = Session.getInstance(props,null); Transport transport; props.put("mail.smtp.host","172.16.0.2"); Message newMessage = new MimeMessage(sendMailSession); newMessage.setFrom(new InternetAddress(request.getParameter("from"))); newMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(request.getParameter("to"))); newMessage.setSubject(request.getParameter("title")); newMessage.setSentDate(new Date()); newMessage.setText(request.getParameter("text")); transport = sendMailSession.getTransport("smtp"); transport.send(newMessage); out.println("Your mail has been sent."); }catch(Exception e){ out.println(e.toString()); } %> </body> </html>
示例11-4:发送HTML格式的邮件
源文件:sendhtmlmail.jsp
<%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.util.*,javax.mail.*,javax.mail.internet.*" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk"> <tilte>发送页面</tilte> </head> <body> <% request.setCharacterEncoding("gbk"); try{ String tto = request.getParameter("to"); String ttitle = request.getParameter("title"); String tcontent = request.getParameter("content"); Properties props = new Properties(); props.put("mail.smtp.host","127.0.0.1"); props.put("mail.smtp.auth","true"); Session s = Session.getInstance(props,null); s.setDebug(true); Message message = new MimeMessage(s); message.setFrom(new InternetAddress("xxx@it.org")); message.setRecipient(Message.RecipientType.TO, new InternetAddress(tto)); message.setSubject(ttitle); message.setSentDate(new Date()); BodyPart mdp = new MimeBodyPart(); mdp.setContent(tcontent,"text/html;charset=gbk"); Multipart mm = new MimeMultipart(); mm.addBodyPart(mdp); message.setContent(mm); message.saveChanges(); Transport transport = sendMailSession.getTransport("smtp"); transport.connect("127.0.0.1","xxx","password"); transport.sendMessage(message,message.getAllRecipients()); transport.close(); out.println("Your mail has been sent."); }catch(Exception e){ out.println(e.toString()); } %> </body> </html>
11.3 分页显示
通常可以采用两种策略来实现分页:
基于缓存(Cache-Based):一次性将记录都取出
基于查询(Query-Based):当需要的时候查询
11.3.1 基于缓存的分页策略
示例11-5:处理数据库访问的JavaBean
源文件:CachedPageBean.java
package uikoo9.apps.pages; import java.sql.*; public class D05_CachedpageBean { static String serverName = "localhost"; static String dbDriver = "oracle:jdbc:driver.OracleDriver"; static String instance = "nitpro"; static String connStr = "jdbc:oracle:thin:@" + serverName + ":1521:" + instance; static String dbUser = "system"; static String dbPwd = "manager"; public static Connection getConnection(){ Connection conn = null; try { Class.forName(dbDriver); conn = DriverManager.getConnection(connStr, dbUser, dbPwd); } catch (Exception e) { e.printStackTrace(); } return conn; } public static void closeResultSet(ResultSet rs){ if(rs != null){ try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void closeStatement(Statement stmt){ if(stmt != null){ try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void closeConnection(Connection conn){ if(conn != null){ try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } public static int getRowNumber(){ int num = 0; Connection conn = getConnection(); try { Statement stmt = conn.createStatement(); String sql = "select count(*) as rowNumbers from student"; ResultSet rs = stmt.executeQuery(sql); rs.next(); num = rs.getInt("rowNumbers"); } catch (Exception e) { e.printStackTrace(); } return num; } public static int getTotalPage(int pageSize){ int totalPage = 1; int tmpPage = 0; int rowNum = getRowNumber(); tmpPage = rowNum % pageSize; if(tmpPage == 0){ totalPage = rowNum / pageSize; }else{ totalPage = (int)(Math.floor(rowNum / pageSize) + 1); } return totalPage == 0 ? 1 : totalPage; } public static ResultSet getAllResults(){ Connection conn = null; Statement stmt = null; ResultSet rs = null; String sql = "select * from student order by id"; try { conn = getConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE , ResultSet.CONCUR_READ_ONLY); rs = stmt.executeQuery(sql); } catch (Exception e) { e.printStackTrace(); } return rs; } }
示例11-6:分页的JSP代码
源文件:cachePages.jsp
<%@ page language="java" import="java.sql.*,uikoo9.apps.pages.D05_CachedpageBean" %> <%@ page contentType="text/html; charset=gbk" pageEncoding="gbk" %> <%! ResultSet rs = null; int pageSize = 5; int pages = 1; int totalPage = 0; String str = ""; //显示一页数据 public String showOnePage(ResultSet rs, int pages, int pageSize){ str = ""; try{ rs.absolute((pages-1)*pageSize + 1); }catch(Exception e){} for(int i=1; i<=pageSize; i++){ str += displayOneResult(rs); try{ if(!rs.next()) break; }catch(Exception e){} } return str; } //显示一行数据 public String displayOneResult(ResultSet rs){ String text = ""; try{ text += "<tr>"; text += "<td>" + rs.getString("learner_id") + "</td>"; text += "<td>" + rs.getString("user_id") + "</td>"; text += "</tr>"; }catch(Exception e){} return text; } %> <% try{ rs = D05_CachedpageBean.getAllResults(); }catch(Exception e){ out.println(e.toString()); } %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>分页浏览</title> </head> <body> <h1>分页显示</h1> <hr /> <table border="1"> <tr> <th>learner</th> <th>user</th> </tr> <% totalPage = D05_CachedpageBean.getTotalPage(5); try{ if(request.getParameter("Page")==null || request.getParameter("Page").equals("")) pages = 1; else pages = Integer.parseInt(request.getParameter("Page")); }catch(NumberFormatException e){ pages = 1; } if(pages<1) pages = 1; if(pages>totalPage) pages = totalPage; out.println(showOnePage(rs, pages, pageSize)); %> </table> <form action="cachePages.jsp" method="post"> <% if(pages != 1){ out.println("<a href=D06_cachePages.jsp?Page=1>第一页</a>"); out.println("<a href=D06_cachePages.jsp?Page=" + (pages-1) + ">上一页</a>"); } if(pages != totalPage){ out.println("<a href=D06_cachePages.jsp?Page=" + (pages+1) + ">下一页</a>"); out.println("<a href=D06_cachePages.jsp?Page=" + totalPage + ">最后一页</a>"); } rs.close(); %> <p> 输入页数: <input type="text" name="Page" size="3" value="<%= pages %>" /> <input type="submit" value="翻页" /> 页数:<font color="red"><%=pages%>/<%=totalPage%></font> </p> </form> <hr /> </body> </html>
11.3.2 基于查询的分页策略
示例11-7:处理数据库访问的JavaBean
源文件:QueryPageBean.java
package com.uikoo9.pages; import java.sql.*; public class D07_QueryPageBean { static String serverName = "localhost"; static String instance = "nitpro"; static String connStr = "jdbc:oracle:thin:@" + serverName + ":1521:" +instance; static String dbUser = "system"; static String dbPwd = "manager"; static String dbDriver = "oracle.jdbc.driver.OracleDriver"; public static Connection getConnection(){ Connection conn = null; try{ Class.forName(dbDriver); conn = DriverManager.getConnection(connStr,dbUser,dbPwd); }catch(Exception e){ e.printStackTrace(); } return conn; } public static void closeResultSet(ResultSet rs){ if(rs != null){ try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void closeStatement(Statement stmt){ if(stmt != null){ try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void closeConnection(Connection conn){ if(conn != null){ try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } public static int getRowNumber(){ int num = 0; Connection conn = getConnection(); try { Statement stmt = conn.createStatement(); String sql = "select count(*) as rowNumber from student"; ResultSet rs = stmt.executeQuery(sql); rs.next(); num = rs.getInt("rowNumber"); } catch (Exception e) { e.printStackTrace(); } finally { closeConnection(conn); } return num; } public static int getTotalPage(int pageSize){ int totalPage = 1; int rowNum = getRowNumber(); if((rowNum%pageSize) == 0){ totalPage = rowNum / pageSize; }else{ totalPage = (int) (Math.floor(rowNum/pageSize) + 1); } return (totalPage == 0) ? 1 : totalPage; } public static ResultSet getPageResult(int pageSize, int page){ int start = (page-1) * pageSize; int end = page *pageSize; int rowNumber = getRowNumber(); if(end > rowNumber) end = rowNumber; String sql = "select * from (select row_.*, rownum rownum_ from)"; sql += " (select * from student order by id)"; sql += " row_ where rownum <= ?) where rownum_ > ?"; ResultSet rs = null; Connection conn = getConnection(); try { PreparedStatement stmt = conn.prepareStatement(sql); stmt.setInt(1, end); stmt.setInt(2, start); rs = stmt.executeQuery(); } catch (Exception e) { e.printStackTrace(); } finally { closeConnection(conn); } return rs; } }
示例11-8:分页的JSP代码
源文件:queryPage.jsp
<%@ page language="java" import="java.sql.*,com.uikoo9.pages.D07_QueryPageBean" %> <%@ page contentType="text/html; charset=gbk" pageEncoding="gbk" %> <%! String str; //显示指定ResultSet记录 public String showResult(ResultSet rs){ String text = ""; try{ while(rs.next()){ text += "<tr>"; text += "<td>" + rs.getString("learner_id") + "</td>"; text += "<td>" + rs.getString("user_id") + "</td>"; text += "</tr>"; } }catch(Exception e){ e.printStackTrace(); } return text; }%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>分页显示</title> </head> <body> <h1>分页显示</h1> <hr /> <table border="1"> <tr> <th>learner</th> <th>user</th> </tr> <% int pages = 1; int pageSize = 4; int totalPage = D07_QueryPageBean.getTotalPage(pageSize); try{ if(request.getParameter("Page")==null || request.getParameter("Page").equals("")) pages = 1; else pages = Integer.parseInt(request.getParameter("Page")); }catch(NumberFormatException e){ pages = 1; } if(pages < 1) pages = 1; if(pages > totalPage) pages = totalPage; ResultSet rs = D07_QueryPageBean.getPageResult(pageSize, pages); out.println(showResult(rs)); %> </table> <form action="D08_queryPage.jsp" method="post"> <% if(pages != 1){ out.println("<a href=D08_queryPage.jsp?Page=1>第一页</a>"); out.println("<a href=D08_queryPage.jsp?Page=" + (pages-1) + ">上一页</a>"); } if(pages != totalPage){ out.println("<a href=D08_queryPage.jsp?Page=" + (pages+1) + ">下一页</a>"); out.println("<a href=D08_queryPage.jsp?Page=" + totalPage + ">最后一页</a>"); } rs.close(); %> <p> 输入页数: <input type="text" name="Page" size="3" value="<%= pages %>" /> <input type="submit" value="翻页" /> 页数:<font color="red"><%=pages%>/<%=totalPage%></font> </p> </form> <hr /> </body> </html>
11.4 文件上传
示例11-9:上传文件的表单
源文件:uploadForm.html
<!DOCTYPE html> <html> <head> <title>上传文件</title> </head> <body> <form name="upload" action="uploadFile.jsp" method="post" enctype="multipart/form-data"> 上传文件1:<input type="file" name="file1" value="" /><br /> 上传文件2:<input type="file" name="file2" value="" /><br /> 上传文件3:<input type="file" name="file3" value="" /><br /> <input type="sumbit" value="上传"/> </form> </body> </html>
示例11-10:处理文件上传
源文件:uploadFile.jsp
<%@ page language="java" import="com.jspsmart.upload.*,java.io.File" %> <%@ page contentType="text/html; charset=gbk" pageEncoding="gbk" %> <jsp:useBean id="myUpload" scope="page" class="com.jspsmart.upload.SmartUpload"></jsp:useBean> <% int count = 0; String folder = "e:\\tmp"; java.io.File f = new java.io.File(folder); if(!f.exists()) f.mkdir(); myUpload.initialize(pageContext); myUpload.upload(); for(int i=0; i<myUpload.getFiles().getCount(); i++){ com.jspsmart.upload.File file = myUpload.getFiles().getFile(i); if(!file.isMissing()){ file.saveAs(folder + "\\" + file.getFileName(),myUpload.SAVE_PHYSICAL); count++; } } %> <html> <head><title>上传结果</title></head> <body> <h1>文件上传结果</h1> 上传<%= count %>个文件成功! </body> </html>
11.5 Web应用程序的国际化
示例11-11:定义资源文件
源文件:HelloResource_zh_CN.properties
greeting.word =\u4F60\u597D\uFF01
源文件:HelloResource.properties
greeting.word =How are you\!
示例11-12:实现国际化的JSP程序
<%@ page language="java" import="java.io.*,java.text.*,java.util.*" %> <%@ page contentType="text/html; charset=gbk" pageEncoding="gbk" %> <% ResourceBundle rb = ResourceBundle.getBundle("com.uikoo9.i18n.HelloResource",request.getLocale()); String encoding = "UTF8"; response.setContentType("text/html;charset=" + encoding); String greeting = rb.getString("greeting.word"); %> <html> <head> <title><%= greeting %></title> </head> <body> <h1><%= greeting %></h1> </body> </html>
示例11-13:在Servlet中实现国际化
源文件:Hello.java
package com.uikoo9.i18n; import java.io.IOException; import java.io.PrintWriter; import java.util.ResourceBundle; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class D12_Hello extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ResourceBundle rb = ResourceBundle.getBundle("com.uikoo9.i18n.HelloResource",request.getLocale()); String encoding = "UTF-8"; response.setContentType("text/html;charset=" + encoding); String greeting = rb.getString("greeting.word"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>" + greeting + "</TITLE></HEAD>"); out.println(" <BODY>"); out.println(" <h1>" + greeting + "</h1>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
11.6 DAO(Data Access Object)模式
11.6.1 DAO模式
1.MVC中Controller用Servlet实现,Servlet需要连接数据库,取得数据,封装到JavaBean中,将Servlet中和数据相关的部分单独出来,也就是DAO模式。
2.DAO实现了用来操作数据源的访问机制,数据源可以是RDBMS,LDAP,File,底层socket等。
3.DAO充当了组件和数据源之间的适配器。
11.6.2 Factory/abstract Factory模式
1.简单工厂(Simple Factory)模式,也就是根据指定的参数返回某个类的实例。
2.抽象类StudentDAO有一个抽象方法createStudent(),然后实现它的不同类既可以操作不同的数据库。
11.6.3 DAO+Abstract Factory模式的实例
涉及到的类有:DAOFactory,OracleDAOFactory,StudentDAO,OracleStudentDAO,Student。
DAOFactory可以得到得到StudentDAO,并且是各dbDAOFactory的父类;
OracleDAOFactory是DAOFactory的子类,负责连接oracle数据库,以及返回使用oracle操作student的StudentDAO;
StudentDAO,负责通过各数据库具体的操作student;
OracleStudentDAO,StudentDAO的子类,通过oracle数据库操作student;
Student,student的JavaBean。
示例11-14:抽象工厂类
源文件:DAOFactory.java
package com.uikoo9.dao_factory; public abstract class D13_DAOFactory { public static final int ORACLE = 1; public static final int SQLSERVER = 2; public static final int MYSQL = 3; public abstract D15_StudentDAO getStudentDAO(); public static D13_DAOFactory getDaoFactory(int type){ switch (type) { case ORACLE: return new D14_OracleDAOFactory(); // case SQLSERVER: // return new SQLDAOFactory(); // case MYSQL: // return new MySQLDAOFactory(); default: return null; } } }
示例11-15:针对Oracle的工厂类
源文件:OracleDAOFactory.java
package com.uikoo9.dao_factory; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class D14_OracleDAOFactory extends D13_DAOFactory { public static String serverName = "localhost"; public static String instance = "nitpro"; public static String connStr = "jdbc:oracle:thin:@" + serverName + ":1522:" + instance; public static String dbDriver = "oracle.jdbc.driver.OracleDriver"; public static String dbUser = "tech"; public static String dbPwd = "tech2005"; public D15_StudentDAO getStudentDAO() { return new D16_OracleStudentDAO(); } public static Connection getConnection(){ Connection conn = null; try { Class.forName(dbDriver); conn = DriverManager.getConnection(connStr,dbUser,dbPwd); } catch (Exception e) { e.printStackTrace(); } return conn; } public static void closeResultSet(ResultSet rs){ if(rs != null){ try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void closeStatement(Statement stmt){ if(stmt != null){ try { stmt.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void closeConnection(Connection conn){ if(conn != null){ try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
示例11-16:用于操作Student表的DAO接口
源文件:StudentDAO.java
package com.uikoo9.dao_factory; import java.util.Iterator; public interface D15_StudentDAO { public boolean isExists(D17_Student student); public boolean deleteStudent(D17_Student student); public boolean updateStudent(D17_Student student); public boolean createStudent(D17_Student student); public Iterator<D17_Student> getAllStudents(); }
示例11-17:在Oracle中操作Student表的DAO类实现
源文件:OracleStudentDAO.java
package com.uikoo9.dao_factory; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Iterator; public class D16_OracleStudentDAO implements D15_StudentDAO { private final String INSERT_A_STUDENT = "insert into student values(?,?.?)"; private final String GET_ALL_STUDENTS = "select * from student order by id"; private final String GET_A_STUDENT = "select * from student where id=?"; private final String DEL_A_STUDENT = "delete from student where id=?"; private final String UPDATE_A_STUDENT = "update student set name=?,course=? where id=?"; public boolean isExists(D17_Student student) { Connection conn = null; PreparedStatement stmt = null; boolean tmp = true; try { conn = D14_OracleDAOFactory.getConnection(); stmt = conn.prepareStatement(GET_A_STUDENT); stmt.setInt(1, student.getId()); ResultSet result = stmt.executeQuery(); if(result.next()) tmp = true; } catch (Exception e) { e.printStackTrace(); tmp = false; } finally { D14_OracleDAOFactory.closeStatement(stmt); D14_OracleDAOFactory.closeConnection(conn); } return tmp; } public boolean deleteStudent(D17_Student student) { Connection conn = null; PreparedStatement stmt = null; boolean tmp = true; try { conn = D14_OracleDAOFactory.getConnection(); stmt = conn.prepareStatement(DEL_A_STUDENT); stmt.setInt(1, student.getId()); int result = stmt.executeUpdate(); if (result != 1) tmp = false; } catch (Exception e) { e.printStackTrace(); tmp = false; } finally { D14_OracleDAOFactory.closeStatement(stmt); D14_OracleDAOFactory.closeConnection(conn); } return tmp; } public boolean updateStudent(D17_Student student) { Connection conn = null; PreparedStatement stmt = null; boolean tmp = true; try { conn = D14_OracleDAOFactory.getConnection(); stmt = conn.prepareStatement(UPDATE_A_STUDENT); stmt.setString(1, student.getName()); stmt.setString(2, student.getCourse()); stmt.setInt(3, student.getId()); int result = stmt.executeUpdate(); if(result != 1) tmp = false; } catch (Exception e) { e.printStackTrace(); tmp = false; } finally { D14_OracleDAOFactory.closeStatement(stmt); D14_OracleDAOFactory.closeConnection(conn); } return tmp; } public boolean createStudent(D17_Student student) { Connection conn = null; PreparedStatement stmt = null; boolean tmp = true; try { conn = D14_OracleDAOFactory.getConnection(); stmt = conn.prepareStatement(INSERT_A_STUDENT); stmt.setInt(1, student.getId()); stmt.setString(2, student.getName()); stmt.setString(3, student.getCourse()); int result = stmt.executeUpdate(); if(result != 1) tmp = false; } catch (Exception e) { e.printStackTrace(); tmp = false; } finally { D14_OracleDAOFactory.closeStatement(stmt); D14_OracleDAOFactory.closeConnection(conn); } return tmp; } public Iterator<D17_Student> getAllStudents() { Connection conn = null; PreparedStatement stmt = null; try { conn = D14_OracleDAOFactory.getConnection(); stmt = conn.prepareStatement(GET_ALL_STUDENTS); ResultSet rs = stmt.executeQuery(); D17_Student student = null; ArrayList<D17_Student> students = new ArrayList<D17_Student>(); while(rs.next()){ student = new D17_Student(); student.setId(rs.getInt("id")); student.setName(rs.getString("name")); student.setCourse(rs.getString("course")); students.add(student); } return students.iterator(); } catch (Exception e) { e.printStackTrace(); return null; } finally { D14_OracleDAOFactory.closeStatement(stmt); D14_OracleDAOFactory.closeConnection(conn); } } }
示例11-18:Student的JavaBean类
源文件:Student.java
package com.uikoo9.dao_factory; public class D17_Student { private int id; private String name; private String course; public D17_Student(){ } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCourse() { return course; } public void setCourse(String course) { this.course = course; } }
11.7 中文乱码问题
11.7.1 字符编码
包括:ASCII,ISO8859,GB2312,GBK,UNICODE,UTF-8
11.7.2 乱码产生的原因
11.7.3 乱码解决方案
1.JSP页面最基本的乱码问题
代码:
<%@ page language="java" pageEncoding="utf-8"%> <%@ page contentType="text/html; charset=iso8859-1"%> <html> <head> <title>中文问题</title> <meta http-equiv="Content-Type" content="text/html; charset=gbk"> </head> <body> 乱码问题,真是头疼。 </body> </html>
其中:
<%@ page language="java" pageEncoding="utf-8"%>pageEncoding="utf-8"为JSP文件的存储格式,
<%@ page contentType="text/html; charset=iso8859-1"%>charset=iso-8859-1为JSP文件的解码格式,
<meta http-equiv="Content-Type" content="text/html; charset=gbk">上面为浏览器的解码格式,
一般将以上三处都写为utf-8编码格式。
2.表单使用POST方式提交后接收到的乱码问题
示例11-19:过滤器解决乱码
源文件:SetCharacterEncodingFilter.java
package com.uikoo9.chinese; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; @SuppressWarnings("serial") public class D19_SetCharacterEncodingFilter extends HttpServlet implements Filter { @SuppressWarnings("unused") private FilterConfig filterConfig; public void init(FilterConfig arg0) throws ServletException { this.filterConfig = arg0; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); } }
源文件:web.xml
<filter> <filter-name>encodingFilter</filter-name> <filter-class>com.uikoo9.chinese.D19_SetCharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3.表单使用GET方式导致乱码的处理方式
String userName = request.getParameter("userName"); userName = new String(userName.getBytes("userName"),"utf-8");
4.数据库中读取和存储中文时的乱码问题
相关文章推荐
- Jdbc入门介绍第二章——Jdbc结合JSP和Servlet的简单综合应用
- 《Head First Servlets & JSP》-11-Web应用部署
- 【Servlet】Servlet应用的get、post访问及和JSP的配合使用
- 一个简单的jsp和servlet应用(入门之选)
- JSP作业5:servlet应用--图片验证码
- 掌握 JSP 九大隐式对象--(Servlet 中使用的对象在 JSP 中的应用)
- JSP/SERVLET开发应用服务器软件BEA WebLogic的配置和部署
- JSP/Servlet-----11、Filter
- (11)jsp+servlet编程实战《猜数字游戏》
- JSP+Servlet+Tomcat应用开发
- jsp,servlet,javabean在web应用中的角色
- Tomcat下JSP、Servlet和JavaBean环境的配置和应用建立
- JSP/Servlet中获得当前应用的相对路径和绝对路径
- JSP简单练习-包装类综合应用实例
- 【学习摘记】马士兵Servlet&JSP_课时11-课时14_session
- jsp&servlet和JDBC的综合使用
- Servlet和JSP的协调运行——通过调整Servlet和JSP来提高你的企业应用的运行性能
- 11:回文素数( 1.13编程基础之综合应用)
- maven管理的jsp应用如何添加servlet、jsp相关依赖
- 01-web服务器、应用服务器、JSP&SERVLET容器