最近老師讓我們給大二的學弟學妹們講解jsp+javabean+servlet,很頭疼,不知道從哪里下手,感覺自己好像也不是太懂得樣子哈哈哈,那就寫一篇博文來發表一下自己的看法,順便理清思路,不能被大二的學弟學妹嘲笑,對吧!
那么什么是servlet?
Servlet 是在服務器上運行的小程序,用來動態的顯示 Web 內容。這個流程大概就是
-
客戶端發送請求至服務器端;
-
服務器將請求信息發送至 Servlet;
-
Servlet 生成響應內容並將其傳給服務器。響應內容動態生成,通常取決於客戶端的請求;
-
服務器將響應返回給客戶端。
什么是Javabean呢?
說白了就是類而已,只不過現在改了一個名字而已,之前寫的時候都是一堆類混在一起,現在就是把他們拆開,按照不同的功能放在一起,一般我們用四個包來區分。

- com.Bean包:這個包里面放的都是一些屬性類,一般數據庫里面有什么表,相應的就要有什么bean,當然表里面的數據在bean里面也要全有,比如有一個Student表,表里面有id,name那么在該包下就要建立相應的Studentbean(Studentbean只是一個名字,你自己可以隨便取)類,有私有變量id和name,與之對應的get和set函數。
- com.Dao包:這個包就是放一些類,類里面的函數就是用來對數據庫進行操作的,例如增刪改查。
- com.DBUtil:這包里面放的就是用來連接數據庫的函數,在Dao函數里面直接調用這個就能連接數據庫,代碼復用。
- com.Servlet:這個包放置的就是servlet類,用來網頁與后台數據的交互,下面講解一個簡單的登錄界面JSP+javabean+Servlet.
讓我們用程序來實現一下吧.這樣更能很好的理解他到底是干嘛的。
一:首先我們需要建立一個登錄界面,很簡單只需要一個用戶名username和password的文本輸入框就可以了。
Login.jsp
<%@ page language="java" isErrorPage="true" pageEncoding="utf-8"%> <!DOCTYPE html> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div class="container"> <section id="content"> <form action="" method="post"><!---這里action的地址我們先不寫,一會配置完servlet再回來補充。---> <h1>登錄 界面</h1> <div> <input type="text" placeholder="登錄名" required="" id="username" name="username1"/> </div> <div> <input type="password" placeholder="密碼" required="" id="password" name="password1" /> </div> <div> <input type="submit" value="登 錄" /> <a href="#">注冊</a> </div> </form><!-- form --> <div class="button"> </div><!-- button --> </section><!-- content --> </div><!-- container --> </body> </html>
二:我們需要建立與之匹配的數據庫,下面我們建立一個servlet的數據庫建立一個user的表,當然只需要用戶名和密碼就行,類型為varchar類型就行,值都為123.

三:接下來我們需要建立一個com.Bean的包,上面說了這個里面的數據與數據庫都是一一對應的,我們給包取名為bean,將類取名為Userbean

package bean; public class Userbean { private String username;//用戶名 private String password;//密碼都是與數據庫匹配的,下面是set和get函數 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; } }
四:接下來我們需要建立數據庫的連接com.DBUtl,類名取名為DBUtil。

package com.DBUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtil { public static String db_url="jdbc:mysql://localhost:3306/servlet?uerUnicode=true&characterEncoding=UTF-8"; //這是連接數據庫,servlet是數據庫的名稱,uerUnicode=true&characterEncoding=UTF-8是將字符集設置為utf-8,避免亂碼。 public static String db_user="root";//數據的用戶名 public static String db_password="20153246";//數據庫的密碼 public static Connection getConn()//獲取連接,返回Connection類型,必須設置為static這樣才能在其他類中使用 { Connection conn=null; try { Class.forName("com.mysql.jdbc.Driver");//加載驅動 conn=DriverManager.getConnection(db_url,db_user,db_password);//連接數據庫 } catch(Exception e) { e.printStackTrace(); } return conn; } public static void close(Statement state,Connection conn)//關閉函數 { if(state!=null)//只有狀態和連接時,先關閉狀態 { try { state.close(); } catch(SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch(SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet rs,Statement state,Connection conn) { if(rs!=null)//有結果集,狀態和連接時,先關閉結果集,在關閉狀態,在關閉連接 { try { rs.close(); } catch(SQLException e) { e.printStackTrace(); } } if(state!=null) { try { state.close(); } catch(SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch(SQLException e) { e.printStackTrace(); } } } }
五:然后我們就要建立servlet類,建立一個com.servlet的包,建立一個Userservlet的servlet類

package com.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.Userdao; @SuppressWarnings("serial") public class Userservlet extends HttpServlet { //當從jsp跳轉到servlet類時,首先執行service函數(這是定理) protected void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException { req.setCharacterEncoding("utf-8");//設置字符集,避免亂碼 //獲取jsp界面需要進行的操作, String method = req.getParameter("method"); if(method.equals("login"))//轉到login函數 { login(req,resp); } } protected void login(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException { req.setCharacterEncoding("utf-8"); String username = req.getParameter("username1");//獲取jsp界面的username1和password1的值 String password = req.getParameter("password1"); } }
六:配置servlet文件,用來實現從jsp界面跳轉到servlet的操作。在WEB-INF下面建立.xml文件,取名必須為web,

<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>Userservlet</servlet-name><!--servlet的別名,隨便取 --> <!--servlet的包路徑,后面再加上.servlet類名 ,這里的類名必須是包下面的servlet類名,目的是讓找到該servlet的路徑 --> <servlet-class>com.servlet.Userservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Userservlet</servlet-name><!--servlet的別名,和上面保持一致就行 --> <!--jsp跳轉到servlet的路徑名,自己取,用來從jsp界面跳轉到servlet的路徑,程序會根據路徑找到servlet的位置 --> <url-pattern>/Servlet/Userservlet</url-pattern><!-- --> </servlet-mapping> </web-app>
七:建立Dao,用來執行sql語句,判斷是否登錄成功。類名取為Userdao,

package dao; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import db.DBUtil; public class Userdao { public int login(String username,String password) { Connection conn = DBUtil.getConn();//這里就是從DBUtil類里面得到連接 Statement state =null; ResultSet rs = null; int flag=0; try { String sql = "select * from user where name = '"+username+"'";//SQL語句, state = conn.createStatement(); rs=state.executeQuery(sql); if(rs.next()) { if(rs.getString("password").equals(password)) { flag=1; } } } catch(Exception e) { e.printStackTrace(); } finally { DBUtil.close(rs, state, conn); } return flag; } }
八:修改servlet下面的代碼,紅色的為添加的代碼
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import dao.Userdao; @SuppressWarnings("serial") public class Userservlet extends HttpServlet { //當從jsp跳轉到servlet類時,首先執行service函數(這是定理) protected void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException { req.setCharacterEncoding("utf-8");//設置字符集,避免亂碼 //獲取jsp界面需要進行的操作, String method = req.getParameter("method"); if(method.equals("login"))//轉到login函數 { login(req,resp); } } protected void login(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException { req.setCharacterEncoding("utf-8"); String username = req.getParameter("username1");//獲取jsp界面的username1和password1的值 String password = req.getParameter("password1"); Userdao userdao = new Userdao();//創建Userdao的實例 int flag = userdao.login(username, password);//用來判斷是否登陸成功 if(flag==1) { System.out.println("登錄成功!"); resp.sendRedirect(req.getContextPath()+"/index.jsp"); } else { System.out.println("登錄失敗!"); } } }
九:在login.jsp界面我們剛剛沒有添加action的路徑,現在將他加上,路徑就是在web.xml文件下剛剛配置的路徑,
<%@ page language="java" isErrorPage="true" pageEncoding="utf-8"%> <!DOCTYPE html> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div class="container"> <section id="content"> <form action="${pageContext.request.contextPath}/Servlet/Userservlet?method=login" method="post">
<!---${pageContext.request.contextPath}的目的是找到主工程的名字,/Servlet/Userservlet就是web.xml下面配置的路徑,也就是servlet的路徑--->
<h1>登錄 界面</h1>
<div>
<input type="text" placeholder="登錄名" required="" id="username" name="username1"/>
</div>
<div>
<input type="password" placeholder="密碼" required="" id="password" name="password1" />
</div>
<div>
<input type="submit" value="登 錄" />
<a href="#">注冊</a>
</div>
</form><!-- form -->
<div class="button">
</div><!-- button -->
</section><!-- content -->
</div><!-- container -->
</body>
</html>
十:執行一下login.jsp,有一個成功登陸的界面index.jsp上面就寫着這是主頁,另外在控制台輸出了一句話登陸成功,這里我就不粘貼代碼了,

結尾:我們發現上面的代碼里面我們沒有用的Userbean這個類,是不是他就沒有用呢,顯然不是,這里我們做登陸的時候不需要這個,但是我們要進行將數據庫的數據傳遞到jsp界面時,我們就需要這個類了。
如果有什么問題,歡迎提問。
