一、目的
1)理解Java Bean的设计思想,掌握在JSP和Servlet中访问Bean的方法;
2)理解EL和JSTL的概念和用途,学会在JSP中使用EL和JSTL简化页面;
3)理解MVC设计模式,能够结合使用Servlet、JSP及Java Bean技术进行Web应用开发;
二、原理
1、Java Bean的基本设计思想,如何在JSP和Servlet中访问Java Bean;
2、EL和JSTL的概念,如何在JSP中使用EL和JSTL;
3、MVC模式的基本理念,如何在Web应用中引入MVC模式;
三、实现过程及步骤
1、使用JavaBean技术改进自己的留言本应用,创建VO对象封装用户数据和留言数据,创建DAO对象封装用户注册、登录及留言添加和查询的功能,并在JSP或Servlet中以小程序代码的方式访问这些Java
Bean;
(1)创建VO对象封装用户数据和留言数据:
用户数据:
package vo;
public class UserVO {
String username;
String password;
String email;
public UserVO() {
}
public UserVO(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
留言数据:
package vo;
public class BookVO {
String name;
String title;
String content;
public BookVO() {
}
public BookVO(String name, String title, String content) {
this.name = name;
this.title = title;
this.content = content;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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;
}
}
(2)创建DAO对象封装用户注册、登录及留言添加和查询的功能:
package dao.impdao;
import dao.DAO;
import vo.BookVO;
import vo.UserVO;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class loadDAO implements DAO {
@Override
public Connection getConnection() throws NamingException, SQLException {
Context context = new InitialContext();
DataSource dataSource = (DataSource)context.lookup("java:/comp/env/jdbc/zhai");
Connection conn= dataSource.getConnection();
return conn;
}
@Override
public void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection conn) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!= null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Override
public int register(UserVO userVO) throws SQLException, NamingException {
ResultSet rs = null;
PreparedStatement ps = null;
Connection conn = this.getConnection();
ps = conn.prepareStatement("INSERT into guestbook.user(username, password, email) values (?,?,?)");
ps.setString(1, userVO.getUsername());
ps.setString(2, userVO.getPassword());
ps.setString(3, userVO.getEmail());
int stat = ps.executeUpdate();
this.close(rs,ps,conn);
return stat;
}
@Override
public int login(String username, String password) throws SQLException, NamingException {
int stat = 0;
ResultSet rs = null;
PreparedStatement ps = null;
Connection conn = this.getConnection();
ps = conn.prepareStatement("SELECT * FROM user WHERE username = ?");
ps.setString(1,username);
rs= ps.executeQuery();
rs.next();
String passwordTemp = rs.getString(2);
if (passwordTemp.equals(password))
{
stat= 1;
}
else
{
stat = 0;
}
return stat;
}
@Override
public int addMsg(BookVO recordVO) throws SQLException, NamingException {
ResultSet rs = null;
PreparedStatement ps = null;
Connection conn = this.getConnection();
ps= conn.prepareStatement("INSERT into guestbook.book(name, title, content) values (?,?,?)");
ps.setString(1, recordVO.getName());
ps.setString(2, recordVO.getTitle());
ps.setString(3, recordVO.getContent());
int stat = ps.executeUpdate();
this.close(rs,ps,conn);
return stat;
}
@Override
public ArrayList<BookVO> showAllMsg() throws SQLException, NamingException {
List<BookVO> listRecord = new ArrayList<BookVO>();
BookVO bookVO = null;
ResultSet rs = null;
PreparedStatement ps = null;
Connection conn = null;
String sql = "SELECT * FROM guestbook.book";
conn= this.getConnection();
ps= conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next())
{
bookVO = new BookVO(rs.getString(1),rs.getString(2),rs.getString(3));
listRecord.add(bookVO);
}
this.close(rs,ps,conn);
return (ArrayList<BookVO>)listRecord;
}
}
(3)注册页面:
package servlet;
import dao.DAO;
import vo.UserVO;
import dao.impdao.loadDAO;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
@WebServlet("/register")
public class register extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
UserVO userVO = new UserVO(username,password,email);
DAO bookDAO = new loadDAO();
try {
int state = bookDAO.register(userVO);
if (state == 1)
{
response.sendRedirect("login.html");
}
else
{
response.sendRedirect("register.html");
}
} catch (SQLException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
}
}
(4)登录页面:
package servlet;
import dao.DAO;
import vo.UserVO;
import dao.impdao.loadDAO;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
@WebServlet("/login")
public class login extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
HttpSession session = request.getSession(true);
ServletContext application = this.getServletContext();
DAO bookDAO = new loadDAO();
int count;
try {
int stat = bookDAO.login(username,password);
if (stat == 1)
{
UserVO userVO = new UserVO();
userVO.setUsername(username);
if(session.isNew()){
count = 0;
application.setAttribute("COUNT",count);
}
session.setAttribute("JudgeLogin",userVO);
response.sendRedirect("displaymsg.jsp");
}
else
{
response.setCharacterEncoding("UTF-8");
RequestDispatcher rd = request.getServletContext().getRequestDispatcher("/login.html");
PrintWriter pw = response.getWriter();
pw.println("<div style='color:red'>Incorrect username or password!</div>");
rd.include(request,response);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
}
}
(5)添加留言:
package servlet;
import dao.DAO;
import vo.BookVO;
import dao.impdao.loadDAO;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
@WebServlet("/msg")
public class msg extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String title = request.getParameter("title");
String content = request.getParameter("content");
BookVO bookVO = new BookVO(name,title,content);
DAO dao = new loadDAO();
try {
int stat = dao.addMsg(bookVO);
if (stat == 1)
{
response.sendRedirect("succadding.html");
}
else
{
response.encodeRedirectURL("UTF-8");
RequestDispatcher rd = request.getServletContext().getRequestDispatcher("/msg.jsp");
PrintWriter pw = response.getWriter();
pw.println("<div style='color:red'>Please leave a message again!</div>");
rd.include(request,response);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
}
}
(6)运行结果:
登录成功后显示留言本:
点击Continue adding message继续添加留言,页面如下:
2、使用EL和JSTL技术对留言本应用进行改进,尽量消除JSP中嵌入的JAVA 代码。
核心代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<html>
<head>
<meta charset="UTF-8">
<title>WriteMessage</title>
</head>
<body>
<form action="msg" method="post">
<h1>Message Book</h1><br>
<c:if test="${ !empty sessionScope.JudgeLogin}">
<p>already logged in</p>
</c:if>
<c:if test="${ empty sessionScope.JudgeLogin}">
<p>not log in</p>
</c:if>
Name:
<input name="name" type="text"><br>
Title:
<input name="title" type="text"><br>
Content:
<textarea name="content" id="content" cols="60" rows="5"></textarea><br>
<input type="submit" name="submit" value="Submit" >
</form>
<a href="displaymsg.jsp">View all message</a> <a href="register.html">go to rigister-></a> <a href="login.html">to go log in
-></a>
</body>
</html>
3、使用MVC模式改造留言本应用,可以自己搭建MVC框架,也可以使用Struts、Spring MVC等现成的MVC框架。
(1)MVC 模式代表 Model-View-Controller(模型-视图-控制器) 的缩写,是一种软件设计的典范,用一种业务逻辑聚集到一个部件里面。
Model(模型):是应用程序中用于处理应用程序数据的部分,模型对象负责在数据库中存取数据。
View(视图):是应用程序中处理数据现实的部分,视图是依据模型数据创建的。
Controller(控制器):是应用程序中处理用户交互的部分,负责从视图中读取数据,控制用户输入,并向模型发送数据。
(2)在MVC模式下改造的留言本如图所示: