您的位置:首页 > Web前端 > JavaScript

11_JSP/Servlet的综合应用

2012-12-18 13:36 513 查看
11.1 网站计数器

示例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.数据库中读取和存储中文时的乱码问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: