早期的Java EE項(xiàng)目全部采用JSP編寫(xiě),JSP文件既要負(fù)責(zé)創(chuàng)建HTML頁(yè)面,又要控制網(wǎng)頁(yè)流程.同時(shí)還要負(fù)責(zé)處理業(yè)務(wù)邏輯. 這給Java EE的開(kāi)發(fā)帶來(lái)一系列問(wèn)題 如 代碼耦合性強(qiáng),系統(tǒng)控制流程復(fù)雜,難以維護(hù)等,為了解決這些問(wèn)題,原Sun公司制定了Model1模式作為Java EE程序員開(kāi)發(fā)的考性規(guī)范.
在Java EE程序開(kāi)發(fā)中,通常用JSP負(fù)責(zé)動(dòng)態(tài)生成Web網(wǎng)頁(yè),而業(yè)務(wù)邏輯則由其他可重用的組件(如JavaBean)來(lái)實(shí)現(xiàn) .JSP可通過(guò)Java程序片段來(lái)訪問(wèn)這些組件,于是就有了JSP+JavaBean這樣同行的程序結(jié)構(gòu) ,也就是Model1開(kāi)發(fā)模式.
Model1開(kāi)發(fā)模式圖
基于Model1架構(gòu)的Java EE程序 ,其工作流程都死按如下4步進(jìn)行的.
- 瀏覽器發(fā)出請(qǐng)求 該請(qǐng)求由JSP頁(yè)面 接收
- JavaBean用于實(shí)現(xiàn)業(yè)務(wù)邏輯 JSP根據(jù)請(qǐng)求的需要與不同的JavaBean進(jìn)行交互
- JavaBean執(zhí)行業(yè)務(wù)處理 通過(guò)JDBC操作數(shù)據(jù)庫(kù)
- JSP將程序運(yùn)行的結(jié)果信息生成動(dòng)態(tài)Web網(wǎng)頁(yè)發(fā)回瀏覽器
下面是一個(gè)簡(jiǎn)易留言版的實(shí)例
登陸頁(yè)面 login.jsp
<%--
Created by IntelliJ IDEA.
User: FX50J
Date: 2018/1/17
Time: 15:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=gb2312" language="java" %>
<html>
<head>
<title>簡(jiǎn)易留言板</title>
</head>
<body>
<form action="newvalidate.jsp" method="post">
<table>
<caption>用戶登陸</caption>
<tr>
<td>用戶名:</td>
<td>
<input type="'text" name="username" size ="20" />
</td>
</tr>
<tr>
<td>密碼:</td>
<td>
<input type="password" name="password" size="21"/>
</td>
</tr>
</table>
<input type="submit" value="登陸"/>
<input type="reset" value="重置"/>
</form>
如果沒(méi)有注冊(cè)單機(jī)<a href=""> 這里</a>注冊(cè)!
</body>
</html>
信息處理 newvalidate.jsp
//主要用來(lái)處理 login.jsp 發(fā)送過(guò)來(lái)的信息 如果正確轉(zhuǎn)向留言板頁(yè)面
//如果錯(cuò)誤 轉(zhuǎn)向error頁(yè)面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page language="java" pageEncoding="gb2312" import="java.sql.*,org.easybooks.test.model.vo.UserTable" %>
<jsp:useBean id="SqlSrvDB" scope="page" class="org.easybooks.test.jdbc.SqlSrvDBConn"/>
<html>
<head>
<title>newValidate</title>
</head>
<body>
<%
request.setCharacterEncoding("gb2312"); //設(shè)置請(qǐng)求編碼
String user = request.getParameter("username");
String pwd = request.getParameter("password");
boolean validated = false;
UserTable User = null; //疑惑
//先獲得UserTable對(duì)象 如果是第一次訪問(wèn)該頁(yè) 用戶對(duì)象肯定為空 但如果是第二次甚至是第三次 就直接登陸主頁(yè)而無(wú)須重復(fù)驗(yàn)證用戶信息
User =(UserTable)session.getAttribute("User");
//如果 用戶是第一次進(jìn)入 會(huì)話中尚未存儲(chǔ)User持久化啊對(duì)象 故為null
//if(session.getAttribute("User")==null) System.out.println("Now the problem is solved");用來(lái)debug用的 可以無(wú)視
if(User==null){
//查詢userTable表中的記錄
String sql = "select * from usertable";
ResultSet rs = SqlSrvDB.executeQuery(sql);
// System.out.println(user+" "+pwd); //debug用
while(rs.next()){
// System.out.println(rs.getString("username")+" "+rs.getString("password")); debug用
if(rs.getString("username").trim().compareTo(user)==0 && rs.getString("password").trim().compareTo(pwd)==0){
validated = true;
User = new UserTable(); //創(chuàng)建持久化的JavaBean對(duì)象user
User.setId(rs.getInt("id"));
User.setUsername(rs.getString("username"));
// System.out.println(User.getUsername()); debug用
User.setPassword(rs.getString("password"));
// System.out.println(User.getPassword()); debug用
session.setAttribute("User",User); //把user對(duì)象存儲(chǔ)在會(huì)話中
UserTable testUser = (UserTable)session.getAttribute("User");
// if(testUser==null) System.out.println("Error"); debug用
// else System.out.println("There is no error");
}
}
rs.close();
SqlSrvDB.closeStmt();
SqlSrvDB.closeConn();
}
else{
validated = true;
System.out.println("revies validate");
}
// System.out.println(validated); debug用
if(validated){
%>
<jsp:forward page="newmain.jsp" />
<%
}
else{
%>
<jsp:forward page="error.jsp"/>
<%
}
%>
</body>
</html>
用來(lái)保存session信息的UserTable類
//每次成功登陸以后 就設(shè)置一個(gè)session屬性User 下次有此頁(yè)面進(jìn)入時(shí) 便不用再次登陸了
package org.easybooks.test.model.vo;
public class UserTable {
//屬性
private Integer id;
private String username;
private String password;
//屬性id 的 get/set方法
public Integer getId(){
return this.id;
}
public void setId(Integer id){
this.id = id;
}
//屬性u(píng)sername的set/get方法
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username = username;
}
//屬性password的set/get方法
public String getPassword(){
return this.password;
}
public void setPassword(String password){
this.password = password;
}
}
用來(lái)操作數(shù)據(jù)庫(kù)的jdbc類
package org.easybooks.test.jdbc;
import java.sql.*;
public class SqlSrvDBConn {
// public static void main(String[] argv){ debug用
// SqlSrvDBConn sqlSrvDBConn = new SqlSrvDBConn();
// String sql = "select * from usertable";
// sqlSrvDBConn.executeQuery(sql);
// ResultSet rs = sqlSrvDBConn.rs;
// if(sqlSrvDBConn.conn==null) {
// System.out.println("Conn is null");
// }
// if(rs==null){
// System.out.println("Error");
// return ;
// }
// try{
// while(rs.next()){
// System.out.println(rs.getString("username"));
// }
// }catch(SQLException e){
// System.out.println(e.getMessage());
// }
// }
private Statement stmt;
private Connection conn;
public ResultSet rs;
//在構(gòu)造方法中創(chuàng)建數(shù)據(jù)庫(kù)連接
public SqlSrvDBConn(){
stmt = null;
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(Exception e){
System.out.println("Class is error");
}
try{
String uri = "jdbc:mysql://localhost:3306/test?useSSL=true";
String user = "host";
String password = "HanDong85";
conn = DriverManager.getConnection(uri,user,password);
}catch(Exception e){
System.out.println("Connection happened error");
e.printStackTrace();
}
}
public ResultSet executeQuery(String sql){
try{
// stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
}catch(SQLException e){
System.out.println("Data.executeQuery:"+e.getMessage());
}
return rs;
}
//關(guān)閉 對(duì)象
public void closeStmt(){
try{
stmt.close();
}catch(SQLException e){
System.out.println("38行出錯(cuò)啦!!!!");
System.out.println("Data.executeQuery:"+e.getMessage());
}
}
public void closeConn(){
try{
conn.close();
}catch(SQLException e){
System.out.println("Data.executeQuery:"+e.getMessage());
}
}
}
如果正確 則轉(zhuǎn)向main.jsp 此時(shí)便可調(diào)用之前設(shè)為User屬性的session了
<%--
Created by IntelliJ IDEA.
User: FX50J
Date: 2018/1/17
Time: 17:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>留言信息板</title>
</head>
<body>
<%out.print(request.getParameter("username"));%>,你好!歡迎登陸留言板.
</body>
</html>
信息錯(cuò)誤 則轉(zhuǎn)向此頁(yè)
<%--
Created by IntelliJ IDEA.
User: FX50J
Date: 2018/1/17
Time: 17:30
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>出錯(cuò)</title>
</head>
<body>
登錄失敗!單擊<a href="login.jsp">這里</a>返回
</body>
</html>
login頁(yè)面
如果成功則轉(zhuǎn)向此頁(yè)面
后退刷新頁(yè)面
測(cè)試session
點(diǎn)擊登陸
同樣結(jié)果