Servlet筆記1
1.Servlet的介紹:
jsp的本質就是一個Servet,當jsp頁面部署在web容器中,web容器會將jsp編譯成Servlet。並且jsp頁面中的內容都在Servlet中的service()中進行執行,故我們也可以撇開jsp頁面,直接操作Servlet,當把Servlet當做表現層來使用,即直接在Servlet中進行頁面的開發,對於靜態的html標簽的內容,我們要使用輸出流來輸出,雖然這樣可以達到效果,但是開發效率會很低,因為所有的html標簽,都是用Servlet的輸出流來輸出的,極其繁瑣。並且撇開了jsp頁面,美工人員也無法參與到Servlet的開發中來。故自MVC規範出現後,Servlet僅僅作為控制器(Controller)使用,不再需要生成html標簽內容。
2.jsp與Servlet的區別:
1.Servlet中沒有內置對象,原來jsp中的內置對象都要由程序顯示的創建
2.對於靜態的HTML標簽,Servlet都必須要用輸出流來逐行輸出
3.jsp/Servlet的生命周期
jsp的本質就是Servlet,jsp頁面將被Web容器編譯成對應的Servlet,當Servlet在容器中運行的時候,其實例的創建和銷毀都不是程序員控制的,而是由Web容器控制
創建Servlet實例有兩個時機:
1.客戶端第一次請求某個Servlet時,系統創建該Servlet的實例,大部分的Servelt都是這種Servlet
2.Web應用啟動時立即創建Servlet實例,即load-on-startup Servlet
每個Servlet的生命周期
(1)創建Servlet實例
(2)Web容器調用Servlet的init()方法,對Servlet進行初始化
(3)Servlet初始化後,將一直存在與容器中,用於響應客戶端的請求。如果客戶端發送get請求,容器調用Servlet的doGet方法處理並響應請求;如果客戶端發送post請求,容器調用Servlet的goPost方法處理並響應請求。或者統一用service()方法來處理響應用戶請求。
(4)Web容器決定銷毀Servlet時,先調用Servlet的destroy()方法,通常在關閉Web應用之時銷毀Servlet
Servlet的生命周期圖:
4.使用Servlet作為控制器
在標準的MVC模式中,Servlet是僅作為控制器(Controller)使用的,下面通過一個登錄驗證的例子來進行熟悉
登錄頁面:
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2018/1/4 Time: 16:46 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登錄頁面</title> </head> <body> <% if(request.getAttribute("errMsg") != null){ out.println("<span style=‘color:red‘>"+request.getAttribute("errMsg")+"</span><br/>"); } %> <form method="post" action="login"> 用戶名:<input type="text" name="username"><br> 密 碼:<input type="password" name="psw"/><br> <input type="submit" value="登錄"/> </form> </body> </html>
控制器Controller代碼:
/** * Description:servlet * Author: Eleven * Date: 2018/1/6 9:16 */ @WebServlet(name = "login",urlPatterns = {"/login"}) public class LoginServlet extends HttpServlet{ //響應客戶端請求的方法 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String errMsg = ""; //Servlet本身不能輸出響應到客戶端,必須請求轉發到視圖jsp頁面 RequestDispatcher rd; //獲取請求參數 String username = request.getParameter("username"); String psw = request.getParameter("psw"); //Servlet本身不處理任何業務邏輯,調用JavaBean處理用戶請求 try{ DbDao dd = new DbDao("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/test","root","123456"); String sql = "select password from user where username = ?"; ResultSet rs = dd.query(sql,username); if(rs.next()){ //用戶名和密碼匹配 if(rs.getString("password").equals(psw)){ //將用戶信息存在session中 HttpSession session = request.getSession(); session.setAttribute("username",username); //請求轉發 rd = request.getRequestDispatcher("/jsp/welcome.jsp"); rd.forward(request,response); }else { //用戶名和密碼不匹配 errMsg = "用戶名和密碼不匹配,請重新輸入!"; } }else{ //用戶不存在 errMsg = "用戶名不存在,請重新輸入!"; } }catch (Exception e){ e.printStackTrace(); } if(errMsg != null && !errMsg.equals("")){ request.setAttribute("errMsg",errMsg); rd = request.getRequestDispatcher("/jsp/login.jsp"); rd.forward(request,response); } } }
DbDao的代碼:
/** * Description:servlet * Author: Eleven * Date: 2018/1/6 9:27 */ public class DbDao { private Connection conn; private String driver; private String url; private String name; private String psw; public DbDao() { } public DbDao( String driver, String url, String name, String psw) { this.driver = driver; this.url = url; this.name = name; this.psw = psw; } //獲取數據庫連接 public Connection getConnection() throws Exception{ if(conn == null){ //註冊驅動 Class.forName(driver); //獲取連接 conn = DriverManager.getConnection(url,name,psw); } return conn; } //查詢 public ResultSet query(String sql,Object... args) throws Exception{ //創建Statement PreparedStatement pstmt = getConnection().prepareStatement(sql); //設置參數 for(int i=0;i<args.length;i++){ pstmt.setObject(i+1,args[i]); } return pstmt.executeQuery(); } //插入 public boolean insert(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]); } if(pstmt.executeUpdate() != 1){ return false; } return true; } //修改 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(); } //關閉數據庫連接 public void closeConn() throws Exception{ if(conn != null && !conn.isClosed()){ conn.close(); } } public Connection getConn() { return conn; } public void setConn(Connection conn) { this.conn = conn; } 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 getName() { return name; } public void setName(String name) { this.name = name; } public String getPsw() { return psw; } public void setPsw(String psw) { this.psw = psw; } }
Servlet筆記1