<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Love Pisces

    It's not your aptitude but your attitude that determines your altitude!
    posts - 2, comments - 43, trackbacks - 0, articles - 9

    例1-4

            用JSP、Servlet及JavaBeans構(gòu)建一個(gè)簡(jiǎn)單的登陸系統(tǒng)。該系統(tǒng)的要求是,當(dāng)用戶在登陸錄頁(yè)面上填寫用戶名和密碼并提交之后,系統(tǒng)將檢查該用戶是否已經(jīng)注冊(cè);如果該用戶已經(jīng)注冊(cè),系統(tǒng)將進(jìn)入主頁(yè)面,否則就進(jìn)入注冊(cè)頁(yè)面。我們將按照以下步驟構(gòu)建這個(gè)系統(tǒng):

    1.數(shù)據(jù)庫(kù)設(shè)計(jì):使用MS Access作為數(shù)據(jù)庫(kù),構(gòu)建數(shù)據(jù)表T_UserInfo;

    2.構(gòu)建視圖組件:登錄頁(yè)面login.jsp,主頁(yè)面main.jsp,以及注冊(cè)頁(yè)面register.jsp;

    3.構(gòu)建控制層組件:一個(gè)Servlet,取名為loginServlet.java;

    4.構(gòu)建業(yè)務(wù)邏輯層組件(Model組件):一個(gè)JavaBean,取名為loginHandler.java;

    5.構(gòu)建數(shù)據(jù)訪問(wèn)層組件:一個(gè)數(shù)據(jù)訪問(wèn)類,取名為dbPool,java;

    6.編譯、打包程序;

    7.部署該程序到Web服務(wù)器Tomcat中,然后運(yùn)行。

    該系統(tǒng)的工作流程如圖:

     













     

    1.數(shù)據(jù)庫(kù)設(shè)計(jì)

            用戶登錄是一個(gè)涉及數(shù)據(jù)庫(kù)操作的用例。登錄涉及的數(shù)據(jù)表名為test,結(jié)構(gòu)如下:

          字段名:username              字段類型:nvarchar(50)        字段描述:用戶名,主鍵

          字段名:password              字段類型:nvarchar(50)        字段描述:密碼

    2.構(gòu)建視圖組件

            本例有3個(gè)視圖組件,分別是登錄頁(yè)面login.jsp,主頁(yè)面main.jsp及注冊(cè)頁(yè)面register.jsp。它們之間的關(guān)系是,當(dāng)用戶在登錄頁(yè)面login.jsp填上用戶名和密碼后并提交后,系統(tǒng)將檢查用戶是否已經(jīng)注冊(cè),如果該用戶已經(jīng)注冊(cè),系統(tǒng)將進(jìn)入主頁(yè)面main.jsp,否則就進(jìn)入注冊(cè)頁(yè)面register.jsp。

            當(dāng)用戶按下login.jsp頁(yè)面上的“登錄”按鈕后,系統(tǒng)就把請(qǐng)求傳給一個(gè)叫做loginServlet的Servlet。以做進(jìn)一步處理。

    login.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>  
      <body>
      <FORM name="form" action="loginservlet" method="get">
       <P>&nbsp;&nbsp; 用戶名:
        <INPUT type="text" name="username" size="15">
       </P><P>  &nbsp;&nbsp; 密&nbsp; 碼: <INPUT type="password" name="password" size="15">
       </P><P>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT type="submit" name="submit" value="登錄"></P><P>
       </P>
      </FORM>
     </body>
    </html>
             當(dāng)用戶登錄成功后,系統(tǒng)轉(zhuǎn)入main.jsp,告訴用戶已經(jīng)登錄成功,現(xiàn)已進(jìn)入主頁(yè)面。

    main.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>    
        <title>My JSP 'main.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        </head> 
      <body>
        <h1>
        <%=session.getAttribute("username")%>,你成功登錄,現(xiàn)已進(jìn)入主頁(yè)面!
        </h1>
      </body>
    </html>

             當(dāng)用戶登錄失敗后,系統(tǒng)轉(zhuǎn)入register.jsp,告訴用戶登錄失敗,現(xiàn)已進(jìn)入注冊(cè)頁(yè)面,請(qǐng)注冊(cè)用戶信息。

    register.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
      <title>My JSP 'register.jsp' starting page</title>   
      </head> 
      <body>
      <H1>
        <%=session.getAttribute("username")%>,你未能成功登錄,現(xiàn)進(jìn)入注冊(cè)頁(yè)面,請(qǐng)注冊(cè)你的信息!
      </H1>
      </body>
    </html>

            本例的控制器組件是一個(gè)Servlet,叫做loginServlet,該組件先處理HTTP POST請(qǐng)求,然后調(diào)用模型組件或業(yè)務(wù)邏輯組件loginHandler檢查該用戶是否已注冊(cè),如果已注冊(cè),系統(tǒng)轉(zhuǎn)入主頁(yè)面main.jsp,否則進(jìn)入注冊(cè)頁(yè)面register.jsp,要求用戶注冊(cè)自己的信息。另外,Servlet都要在web.xml中聲明。

    loginServlet.java:

    package chap1;

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import java.util.*;

    public class LoginServlet extends HttpServlet{
     private static final long serialVersionUID = 2674925070582791853L;   
     //初始化Servlet
     public void init() throws ServletException{

     }
     //處理HTTP POST請(qǐng)求
     public void doPost(HttpServletRequest request,HttpServletResponse response)
      throws ServletException,IOException{
      //從請(qǐng)求中取出用戶名和密碼的值
      String username=request.getParameter("username");
      String password=request.getParameter("password");  
      //生成一個(gè)ArrayList對(duì)象,并把用戶名和密碼的值存入該對(duì)象中
      ArrayList arr=new ArrayList();
      arr.add(username);
      arr.add(password);
      //生成一個(gè)Session對(duì)象
      HttpSession session=request.getSession(true);
      session.removeAttribute("username");
      session.setAttribute("username",username);
      //調(diào)用模型組件loginHandler,檢查該用戶是否已注冊(cè)
      LoginHandler login=new LoginHandler();
      boolean mark=login.checkLogin(arr); 
      //如果已經(jīng)注冊(cè),進(jìn)入主頁(yè)面
      if(mark) response.sendRedirect("main.jsp");
      //如果未注冊(cè),進(jìn)入注冊(cè)頁(yè)面
      else response.sendRedirect("register.jsp");
     }
     //處理HTTP GET請(qǐng)求
     public void doGet(HttpServletRequest request,HttpServletResponse response)
     throws ServletException,IOException{
      doPost(request,response);
     }
     //銷毀Servlet
     public void destroy(){ 
     }
    }

    web.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee <servlet>
    <servlet-name>loginservlet</servlet-name>
    <servlet-class>chap1.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>loginservlet</servlet-name>
    <url-pattern>/loginservlet</url-pattern>
    </servlet-mapping>
    </web-app>

            本例的模型組件(或稱為業(yè)務(wù)邏輯組件)是loginHandler,它先從數(shù)據(jù)訪問(wèn)組件dbPool取得數(shù)據(jù)庫(kù)連接,然后檢查數(shù)據(jù)庫(kù)中是否已有該用戶的記錄,即檢查還用戶是否已經(jīng)注冊(cè)。如果已注冊(cè),返回true,否則返回false。

    loginHandler.java:

    package chap1;

    import java.sql.*;
    import java.util.*;

    public class LoginHandler {
     
     public LoginHandler() { }
     
     Connection conn;
     PreparedStatement ps;
     ResultSet rs;
     //檢查是否已注冊(cè)
     public boolean checkLogin(ArrayList arr)
     {
      //從數(shù)據(jù)訪問(wèn)組件dbPool中取得連接
      try{ 
      conn=DbPool.getConnection(); 
      String name=(String)arr.get(0);
      String password=(String)arr.get(1);
      String sql="select * from test where username=? and password=?";
      ps=conn.prepareStatement(sql);
      ps.setString(1,name);
      ps.setString(2,password);   
      rs=ps.executeQuery();
      if(rs.next()){
       DbPool.dbClose(conn,ps,rs); //釋放資源
       return true;   
       }
       else{
        DbPool.dbClose(conn,ps,rs);
        return false;    
       }
      }catch(SQLException e){
       System.out.print("SQLException"+e.getMessage());
       return false;
      }
     }
    }
            本例的數(shù)據(jù)庫(kù)訪問(wèn)組件是dbPool,dbPool從一個(gè)屬性文件db.properties中獲得數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,URL,用戶名和密碼,然后利用這些信息連接一數(shù)據(jù)庫(kù),取得連接。因?yàn)樗脭?shù)據(jù)庫(kù)是SQL Server,數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序采用com.microsoft.jdbc.sqlserver.SQLServerDriver,數(shù)據(jù)庫(kù)URL為jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test;本例需要把數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序(3個(gè)jar包)放在lib目錄下。

    DbPool.java:

    package chap1;
    import java.io.*;
    import java.util.*;
    import java.sql.*;

    public class DbPool {
     private static DbPool instance=null;
     //取得連接
     public static synchronized Connection getConnection(){  //多線程.
      if(instance == null){
       instance = new DbPool();
      }
      return instance._getConnection();
     }
     private DbPool()
     {
      super();
     }
     private Connection _getConnection(){
      try{
       String sDBDriver=null;
       String sConnection=null;
       String sUser=null;
       String sPassword=null;
       
       Properties p=new Properties();
       InputStream is=getClass().getResourceAsStream("/db.properties");
       p.load(is);
       sDBDriver=p.getProperty("DBDriver",sDBDriver);
       sConnection=p.getProperty("Connection",sConnection);
       sUser=p.getProperty("User",sUser);
       sPassword=p.getProperty("Password",sPassword);
       
       Properties pr=new Properties();
       pr.put("user",sUser);
       pr.put("password",sPassword);
       pr.put("characterEncoding","GB2312");
       pr.put("userUnicode","TRUE");
       Class.forName(sDBDriver).newInstance();
       return DriverManager.getConnection(sConnection, pr);
       }
        catch(Exception se){
         System.out.println(se.getMessage());
         return null;
      }
     }
     //釋放資源
     public static void dbClose(Connection conn,PreparedStatement ps,ResultSet rs)
      throws SQLException
      {
       rs.close();
       ps.close();
       conn.close();
      }
    }

    db.properties:

    DBDriver=com.microsoft.jdbc.sqlserver.SQLServerDriver
    Connection=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test;
    User=sa
    Password=sa

                編譯loginServlet.java時(shí),需要引用javax.servlet和javax.servlet.http兩個(gè)軟件包。Sun的JDK一般不包含這兩個(gè)軟件包。這兩個(gè)軟件包包含在servlet.jar中。因此在編譯servlet時(shí),需要引用servlet.jar。假如servlet.jar放在d:\library目錄中,servlet程序放在d:\login目錄中,要用javac編譯servlet程序,則編譯命令如下:
    D:\javac  -classpath  "d:\library\servlet.jar"  login\*.java
     
             在實(shí)際的運(yùn)行中,有一些細(xì)節(jié)是需要注意的,我將jsp文件放在了一個(gè)文件夾jsp中,所以遇到了一些問(wèn)題:
    1.jsp頁(yè)面中action屬性是與url-pattern對(duì)應(yīng)的,程序首先與url-pattern對(duì)應(yīng),然后通過(guò)映射找到實(shí)際的servlet類。
    2.jsp頁(yè)面中action屬性內(nèi)容中如果含有“/”,例如:action="/login",則系統(tǒng)將在webapps目錄下開(kāi)始查找對(duì)應(yīng)的servlet類,如果不含有,則從本工程目錄下查找servlet類。 



    主站蜘蛛池模板: 亚洲av无码一区二区三区四区| 亚洲人成色4444在线观看| 亚洲最大免费视频网| 亚洲精品又粗又大又爽A片| 亚洲五月午夜免费在线视频| 一级毛片免费观看不卡的| 亚洲精品无码aⅴ中文字幕蜜桃| 亚洲AV成人精品日韩一区18p| 暖暖免费在线中文日本| 亚洲日韩中文字幕无码一区| 亚洲欧洲中文日韩av乱码| av大片在线无码免费| 一区视频免费观看| 国产精品亚洲精品| 亚洲熟妇av一区二区三区| 成人免费看片又大又黄| 久久午夜夜伦鲁鲁片免费无码| 精品久久久久亚洲| 亚洲国产中文在线二区三区免| 亚洲阿v天堂在线2017免费| 亚洲视频在线免费看| 一级毛片成人免费看a| 2020天堂在线亚洲精品专区| 国产亚洲一区二区手机在线观看 | 精品亚洲国产成人| 亚洲人午夜射精精品日韩| 成年性午夜免费视频网站不卡| 国内精品免费久久影院| 国产成人不卡亚洲精品91| 亚洲成人黄色网址| 亚洲精品中文字幕乱码三区| 国产91在线免费| 黄瓜视频高清在线看免费下载 | 8x8×在线永久免费视频| 九九九精品视频免费| 亚洲国产精品成人AV在线| 亚洲欧洲国产成人精品| 亚洲AV日韩AV天堂久久| 亚洲一区精品无码| 亚洲成aⅴ人片久青草影院 | 亚洲三级中文字幕|