1、使用Servlet作為表現(xiàn)層的三個(gè)劣勢(shì)
- 開(kāi)發(fā)效率低,所有的HTML標(biāo)簽都需使用頁(yè)面輸出流完成;
- 不利于團(tuán)隊(duì)協(xié)作開(kāi)發(fā), 美工人員無(wú)法參與Servlet界面的開(kāi)發(fā);
- 程序可維護(hù)性差,即使修改一個(gè)按鈕的標(biāo)題,都必須重新編輯Java代碼,并重新編譯。
2、Servlet僅作為控制器使用
在標(biāo)準(zhǔn)的MVC模式中,Servlet僅作為控制器使用。Java EE應(yīng)用架構(gòu)正式遵循MVC模式的, 對(duì)于遵循MVC模式的Java EE應(yīng)用而言,JSP僅作為表現(xiàn)層(View)技術(shù), 其作用有兩點(diǎn):
- 負(fù)責(zé)收集用戶請(qǐng)求參數(shù);
- 將應(yīng)用的處理結(jié)果、狀態(tài)數(shù)據(jù)呈現(xiàn)給用戶。
3、示例,一個(gè)簡(jiǎn)單的登錄驗(yàn)證(Servlet作為控制器的MVC應(yīng)用):
1)登錄頁(yè)面login.jsp
<%--
Created by IntelliJ IDEA.
User: Chuan
Date: 2017/9/1
Time: 20:27
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="" %>
<html>
<head>
<title>登錄頁(yè)面</title>
</head>
<body>
<%--輸出出錯(cuò)提示--%>
<span style="color:red; font-weight: bold">
<%
if (request.getAttribute("err") != null)
{
out.println(request.getAttribute("err") + "<br/>");
}
%>
</span>
請(qǐng)輸入用戶名和密碼:
<%--登錄表單,該表單提交到一個(gè)Servlet--%>
<form id="login" method="post" action="login">
用戶名:<input type="text" name="username" /><br/>
密  碼:<input type="password" name="pass" /><br/>
<input type="submit" value="登錄">
</form>
</body>
</html>
2)控制器Servlet代碼LoginServlet.java
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.ResultSet;
@WebServlet(name = "login", urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet
{
//響應(yīng)客戶端請(qǐng)求的方法
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String errMsg = "";
//Servlet本身并不輸出響應(yīng)到客戶端,因此必須將請(qǐng)求轉(zhuǎn)發(fā)到視圖頁(yè)面
RequestDispatcher rd;
//設(shè)置請(qǐng)求的編碼方式
request.setCharacterEncoding("UTF-8");
//獲取請(qǐng)求參數(shù)
String username = request.getParameter("username");
String pass = request.getParameter("pass");
try
{
//Servlet本身并不執(zhí)行任何的業(yè)務(wù)邏輯處理,它調(diào)用JavaBean處理用戶請(qǐng)求
DbDao dd = new DbDao("com.mysql.jdbc.Driver",
"jdbc:mysql://localhost:3306/您的數(shù)據(jù)庫(kù)名字", "您的用戶名", "您的密碼");
//查詢結(jié)果集
ResultSet rs = dd.query("select pass from user_inf"
+ " where name = ?", username);
if (rs.next())
{
//用戶名和密碼匹配
if (rs.getString("pass").equals(pass))
{
//獲取session對(duì)象
HttpSession session = request.getSession(true);
//設(shè)置session屬性,跟蹤會(huì)話狀態(tài)
session.setAttribute("name", username);
//獲取轉(zhuǎn)發(fā)對(duì)象
rd = request.getRequestDispatcher("/welcom.jsp");
rd.forward(request, response);
}
else
{
//用戶名和密碼不匹配
errMsg += "您的用戶名密碼不符合, 請(qǐng)重新輸入";
}
}
else
{
//用戶名不存在時(shí)
errMsg += "您的用戶名不存在,請(qǐng)先注冊(cè)";
}
}
catch (Exception e)
{
e.printStackTrace();
}
if(errMsg != null && !errMsg.equals(""))
{
rd = request.getRequestDispatcher("/login.jsp");
request.setAttribute("err", errMsg);
rd.forward(request, response);
}
}
}
3)本應(yīng)用中的Modle: DbDao.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DbDao
{
private Connection conn;
private String driver;
private String url;
private String username;
private String pass;
public DbDao()
{
}
public DbDao(String driver, String url, String username, String pass)
{
this.driver = driver;
this.url = url;
this.username = username;
this.pass = pass;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
//獲取數(shù)據(jù)庫(kù)連接
public Connection getConnection() throws Exception
{
if (conn == null)
{
Class.forName(this.driver);
conn = DriverManager.getConnection(url, username, this.pass);
}
return conn;
}
//插入記錄
public boolean insert(String sql, Object... args) throws Exception
{
PreparedStatement pstmt = getConnection().prepareCall(sql);
for (int i = 0; i < args.length; i++)
{
pstmt.setObject(i + 1, args[i]);
}
if (pstmt.executeUpdate() != 1)
{
return false;
}
return true;
}
//執(zhí)行查詢
public ResultSet query(String sql, Object... args) throws Exception
{
PreparedStatement pstmt = getConnection().prepareStatement(sql);
for (int i = 0; i < args.length; i++)
{
pstmt.setObject(i + 1, args[i]);
}
return pstmt.executeQuery();
}
//執(zhí)行修改
public void modify(String sql, Object... args) throws Exception
{
PreparedStatement pstmt = getConnection().prepareStatement(sql);
for (int i = 0; i < args.length; i++)
{
pstmt.setObject(i + 1, args[i]);
}
pstmt.executeUpdate();
pstmt.close();
}
//關(guān)閉連接
public void closeConn() throws Exception
{
if(conn != null && !conn.isClosed())
{
conn.close();
}
}
}
4)登錄成功歡迎頁(yè)面welcome.jsp
<%--
Created by IntelliJ IDEA.
User: Chuan
Date: 2017/9/1
Time: 21:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>歡迎頁(yè)面</title>
</head>
<body>
<h3>歡迎登陸</h3>
<%=session.getAttribute("name")%>,歡迎登錄
</body>
</html>
5)數(shù)據(jù)表
user_inf.PNG
6)演示結(jié)果
登錄頁(yè)面.PNG
歡迎頁(yè)面.PNG