今天的学习是漫长的,我试图在我昨天学到的知识上再添加一些新的知识,可这一步却走的非常辛苦。
今天,我跳出了面向过程式的jsp页面书写格式,尝试使用servlet来进行一个简单的网页内容显示部分。假设你的服务器支持servlet,那么你可以跟随我继续走下去,否则,你需要事先配置好你的环境,以支持servlet。环境配置方面的知识我将不再敖述,毕竟在网络中,这方面的知识并不匮乏。
首先,我在网上搜索了一下servlet的一些资料,也试图从中学到一些知识,可是很多教材繁琐的表达形式让我更是一头雾水。我也试图寻找一些基础教材,或是简单的例子。但可悲的是,我并没有从中获得益处,我只好下载一个简单的servlet源码,阅读其内容,并从中寻找一些蛛丝马迹,最后得出一个简单的内容发布页面。
这次的内容发布页面,一共涉及2个页面,一个是AntTest.java文件,还有一个是AntTest.jsp页面。
我会把涉及逻辑的部分卸载java为后缀的文件里,而jsp文件,则只使用循环将内容显示在页面供访客查阅。
事先,我们需要在根目录下查找一个叫WEB_INFO的文件夹,在那里我们可以找到一个web.xml的文件,并且在那里增加内容如下:
<servlet>
<servlet-name>antTest</servlet-name>
<servlet-class>class2.java.antTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>antTest</servlet-name>
<url-pattern>/servlet/antTest</url-pattern>
</servlet-mapping>
这里需要说明的是,两个servlet-name中的名字需要一致,并且,我把我的.java文件放在了java文件夹下,把jsp文件放在了jsp文件夹下
然后,我们打开.java文件,把一下的内容输入到里面
package class2.java;
//导入各种需要用到的库
import java.io.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;
import class2.java.dbaccess.*;
public class jietTest extends HttpServlet{
private final String sendPath = "/class2/jsp/jietTest.jsp";//即将跳转的页面
private static final String CONTENT_TYPE = "text/html;charset=utf-8";//java语言的编码格式
public void doGet( HttpServletRequest request,HttpServletResponse response ) throws IOException,ServletException{
doPost(request,response);
}
public void doPost( HttpServletRequest request,HttpServletResponse response ) throws IOException,ServletException{
HttpSession session = request.getSession(true);//使用session,用来储存下面从数据库读取的内容
dbaccess dbAccess = new dbaccess();//定义数据库对象
ResultSet rsetSel = null;
StringBuffer searchErrMsg = new StringBuffer();//错误捕捉对象
List<HashMap<String,String>> AntTestList = new ArrayList<HashMap<String, String>>();//定义一个二维数组,用来承装数据库内容
HashMap<String,String> AntTestHm;
try {
response.setContentType(CONTENT_TYPE);
ServletContext context = getServletContext();
String strRetnResult=dbAccess.ConnectDB();
rsetSel = dbAccess.SelectSql("select * from AntTestDataBase order by AntKey", searchErrMsg);
if (searchErrMsg.toString().length() == 0) {
while (rsetSel.next()) {
String AntKey = (rsetSel.getString("AntKey") != null) ? (rsetSel.getString("AntKey").trim()) : "";
String AntName = (rsetSel.getString("AntName") != null) ? (rsetSel.getString("AntName").trim()) : "";
String AntYmd = (rsetSel.getString("AntDate") != null) ? (rsetSel.getString("AntDate").trim()) : "";
AntTestHm = new HashMap<String, String>();
AntTestHm.put("AntKey", AntKey);
AntTestHm.put("AntName", AntName);
AntTestHm.put("AntYmd", AntYmd);
AntTestList.add(AntTestHm);
}
}
session.removeAttribute("AntTestList");//清空session中原来储存的二维数组内容
session.setAttribute("AntTestList", AntTestList);//将提取出来的内容储存在session中,以方便在其他页面调用
RequestDispatcher dispatcher = context.getRequestDispatcher(sendPath);//重定向到指定的页面 sendPath 指定的页面
dispatcher.forward(request,response);//返回服务器响应
} catch (Exception e) {
e.printStackTrace();
}
}
}
jsp页面由于只是显示内容,所以逻辑部分相对来说少了很多,内容只有:
<%@ page import="java.io.*,java.util.*,java.lang.Character.UnicodeBlock" contentType="text/html; charset=utf-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ant JAVA练习页面</title>
</head>
<body>
<%
List<HashMap<String,String>> AntTestList = (ArrayList<HashMap<String, String>>) session.getAttribute("AntTestList");//从session中得到AntTestList中的内容
%>
<table>
<%
for (int loopCnt = 0; loopCnt < AntTestList.size();loopCnt++) {//循环读取刚刚从session中得到的内容,并显示在页面中
HashMap<String, String> hm = AntTestList.get(loopCnt);
String AntKey = hm.get("AntKey");
String AntName = hm.get("AntName");
String AntYmd = hm.get("AntYmd");
%>
<tr><td width="200"><%=AntKey %></td><td width="200"><%=AntName %></td><td width="200"><%=AntYmd %></td></tr>
<%
}
%>
</table>
</body>
</html>
数据库的类并非我自己所写,dbaccess.java内容如下:
package class2.java;
import java.sql.*;
public class dbaccess {
private String DRIVER;
private String HOST;
private String USR;
private String PWD;
private Connection Condb;
private Statement stmt;
public dbaccess(String DRIVER, String HOST, String USR, String PWD){
this.DRIVER = DRIVER;
this.HOST = HOST;
this.USR = USR;
this.PWD = PWD;
}
public dbaccess(){
DRIVER = "org.postgresql.Driver";
HOST = "jdbc:postgresql://localhost:5432/dbAntTest?charSet=UTF-8";
USR = "root";
PWD = "123";
}
public String ConnectDB() throws Exception{
String strtmp ="";
try{
Class.forName(DRIVER);
Condb = DriverManager.getConnection(HOST, USR, PWD);
Condb.setAutoCommit(false);
stmt = Condb.createStatement();
stmt.executeUpdate("set client_encoding to 'UTF-8'");
}catch(Exception serrmsg){
strtmp = serrmsg.toString();
}
return strtmp;
}
public String disconnect(ResultSet Rset) throws Exception{
String strtmp = "";
try{
if ( Rset != null) Rset.close();
if ( stmt != null ) stmt.close();
if ( Condb != null ) Condb.close();
}catch(Exception e){
strtmp = e.toString();
}
return strtmp;
}
public ResultSet SelectSql(String sql,StringBuffer sErr) throws Exception {
int inttmp = 0;
ResultSet Rset = null;
inttmp = sErr.length();
if (inttmp > 0){sErr.delete(0,inttmp);}
try {
Rset = stmt.executeQuery(sql);
}catch(Exception e) {
sErr.append(e.toString());
}
return Rset;
}
}
打开IE在地址栏输入http://localhost/class2/servlet/antTest 用以访问刚刚我们所做的页面。
仿佛如我所愿,但这一天的盲目却让我前途迷茫。