天天看點

【Servlet】利用JSTL表達式把Servlet從資料庫讀出的資料推向前台與javax.el.PropertyNotFoundException的錯誤

利用Servlet3.0能夠輕松寫出一個部落格系統,主要是把資料存入資料庫與從資料庫讀出資料怎麼推向前台的問題。本章将會以一個部落格系統來說明,如何利用JSTL表達式把Servlet從資料庫讀出的資料推向前台。将會利用網頁文本格式編輯器xheditor與EL表達式基于Servlet3.0編寫一個部落格系統。雖然涉及的技術很多,但也隻是前面幾講過的技術的綜合

xheditor編輯器具體見《【jQuery】網頁文本格式編輯器xheditor》(點選打開連結)

JSTL表達式具體見《【Servlet】利用Servlet3.0标準與JSTL表達式實作檔案上傳系統,支援圖檔上傳後顯示》(點選打開連結)

本文側重講述,如何把Servlet從資料庫讀出的資料推向前台。把資料庫讀出來的東西壓入一個存放類對象的動态數組ArrayList之後,如果寫不好,會出現javax.el.PropertyNotFoundException的錯誤。這是因為你的類對象寫在Servlet裡面造成了,沒有另開一個新的Java檔案,導緻你的類對象的作用域隻存在于這個Servlet裡面,以緻于前台,無法讀取。

一、基本目标

編寫一個部落格系統,内容方面是帶格式的。輸入完的标題、内容進入資料庫,同時,資料庫中的所有部落格馬上查詢出來,放在網頁中顯示。這本來應該在兩個Servlet完成的,但是為了說明友善,這個輸入與查詢過程一次性地完成。

【Servlet】利用JSTL表達式把Servlet從資料庫讀出的資料推向前台與javax.el.PropertyNotFoundException的錯誤

二、基本思想

網站的目錄結構如下:

【Servlet】利用JSTL表達式把Servlet從資料庫讀出的資料推向前台與javax.el.PropertyNotFoundException的錯誤

lib中存放的是一些必須的包,web.xml不用寫任何東西。把JQuery插件xheditor拷貝過來。

edit.jsp就是一個編輯表單,編輯完送出到Action.java中處理,之後Action.java處理之後把處理結果推到result.jsp中顯示。

Blog.java相當于資料庫中blog表的對象,這個Blog.java如下:

public class Blog{
	private int id;
	private String title;
	private String content;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
}
           

資料庫中的blog檔案如下,有一個一一對應的關系。必須是private靜态類成員與getter與setter方法構成,平時都這樣寫。所謂的持久化對象POJO不就是這個java檔案了。具體理論我也不記得了。反正是這個意思。

【Servlet】利用JSTL表達式把Servlet從資料庫讀出的資料推向前台與javax.el.PropertyNotFoundException的錯誤

dbDAO.java相當于資料庫的操作類,反正與blog.java都是MVC中Model的東西。這個檔案與《【Servlet】根據MVC思想設計使用者登陸、使用者注冊、修改密碼系統》(點選打開連結)中的dbDAO.java是一模一樣的,由于資料庫也是test資料庫,使用者名與密碼都是一樣的。一字沒改。

import java.sql.*;

public class dbDAO {
	private Connection con;

	// 構造函數,連接配接資料庫
	public dbDAO() throws Exception {
		String dburl = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true";
		String dbusername = "root";
		String dbpassword = "root";
		Class.forName("com.mysql.jdbc.Driver");
		this.con = DriverManager.getConnection(dburl, dbusername, dbpassword);
	}

	// 執行查詢
	public ResultSet query(String sql, Object... args) throws Exception {
		PreparedStatement ps = con.prepareStatement(sql);
		for (int i = 0; i < args.length; i++) {
			ps.setObject(i + 1, args[i]);
		}
		return ps.executeQuery();
	}

	// 執行插入
	public boolean insert(String sql, Object... args) throws Exception {
		PreparedStatement ps = con.prepareStatement(sql);
		for (int i = 0; i < args.length; i++) {
			ps.setObject(i + 1, args[i]);
		}
		if (ps.executeUpdate() != 1) {
			return false;
		}
		return true;
	}

	// 執行修改
	public boolean modify(String sql, Object... args) throws Exception {
		PreparedStatement ps = con.prepareStatement(sql);
		for (int i = 0; i < args.length; i++) {
			ps.setObject(i + 1, args[i]);
		}
		if (ps.executeUpdate() != 1) {
			return false;
		}
		return true;
	}

	// 析構函數,中斷資料庫的連接配接
	protected void finalize() throws Exception {
		if (!con.isClosed() || con != null) {
			con.close();
		}
	}
}
           

三、制作過程

1、edit.jsp這個檔案放有一個表單,裡面帶有xheditor編輯器,與xheditor編輯器具體見《【jQuery】網頁文本格式編輯器xheditor》(點選打開連結)中的一模一樣,不說了。注意引入相依的包就可以了。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="xheditor/jquery/jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="xheditor/xheditor.js"></script>
<script type="text/javascript" src="xheditor/xheditor_lang/zh-cn.js"></script>
<title>editor</title>
</head>
<body>
<form method="post" action="action">
	标題:<input type="type" name="title" /><br />
	内容:<br />
	<textarea name="content" class="xheditor-simple {skin:'nostyle',width:'640',height:'300',cleanPaste:2}"></textarea><br />
	<input type="submit" value="送出" />
</form>
</body>
</html>
           

2、edit.jsp把表單送出到Action.java這一url為action的Servlet,Action.java中做兩件事,一件傳過來的資料title與content入庫。之後不做任何停留,把它blog表中的所有資料查詢出來,以id降序排列的形式。同時,注意,要把查詢的結果,全部壓到一個專門存放Blog類對象的動态數組ArrayList裡面,推向result.jsp顯示。 注意,即便這裡隻有一個Servlet,Blog一定要新開一個blog.java,不能僅僅寫在這個Servlet裡面,由于Servlet執行完即銷毀的特性,result.jsp永遠也無法找到blog.java的定義了。出現javax.el.PropertyNotFoundException的錯誤,不是你寫錯JSTL表達式的問題,而是你的作用域沒有覆寫到這裡的問題!

import java.io.*;
import java.sql.*;
import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@SuppressWarnings("serial")
@WebServlet(name = "action", urlPatterns = { "/action" })
public class Action extends HttpServlet {
	// 防止直接輸入網絡浏覽此Servlet
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		PrintStream out = new PrintStream(response.getOutputStream());
		response.setContentType("text/html;charSet=utf-8");
		out.print("請正常打開此頁");
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 設定編碼,請求參數
		request.setCharacterEncoding("utf-8");
		String title = (String) request.getParameter("title");
		String content = (String) request.getParameter("content");
		// 這個存放Blog的動态數組是為了result.jsp顯示資料庫表中的内容
		ArrayList<Blog> blogList = new ArrayList<Blog>();
		try {
			dbDAO db = new dbDAO();
			// 把傳過來的内容入庫
			// 注意即便title與content是字元串變量,這個的?也不用加單引号
			// 因為dbDAO.java已經幫你自動轉化了
			db.insert("insert into blog(title,content) value(?,?)", title,
					content);
			// 把查詢出的東西如下,全部壓入一個存放Blog類對象的動态數組
			ResultSet rs = db.query("select * from blog order by id desc");
			while (rs.next()) {
				Blog blog = new Blog();
				blog.setId(rs.getInt("id"));
				blog.setTitle(rs.getString("title"));
				blog.setContent(rs.getString("content"));
				blogList.add(blog);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		// 之後把這個動态資料壓入request容器,推向result.jsp
		request.setAttribute("blogList", blogList);
		request.getRequestDispatcher("result.jsp").forward(request, response);
	}
}
           

3、result.jsp利用JSTL的一個foreach循環來顯示所有查詢結構,注意在頁頭聲明要使用c标簽,同時,注意,分割線可以用<hr />表示,不用一堆==========符号了。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>結果</title>
</head>
<body>
<h1 align="center">簡易部落格</h1>
<c:forEach var="blog" items="${requestScope.blogList}" >
文章${blog.id}:${blog.title}<br />
<hr />
${blog.content}<br />
<hr />
</c:forEach>

<p align="center" ><a href="edit.jsp" target="_blank" rel="external nofollow" >傳回</a></p>
</body>
</html>
           

繼續閱讀