1. 程式人生 > >JavaWeb網站用Servlet實現前後臺互動

JavaWeb網站用Servlet實現前後臺互動

現在很多網站都用框架開發,不過為了奠定基礎,我在這裡記錄下在沒有框架的條件下進行網站開發的總結.

基本框架

JSP專案基本框架

Servlet用於處理使用者的Http請求,本文不講原理,只是我的個人程式碼總結。程式用最簡單的Servlet實現。

Servlet程式碼結構:

public class Example extends HttpServlet{
     public void doPost(HttpServletRequest request,HttpServlet response)throws ServletException{
     //do something
}
     public
void doGet.. }

一般需要重寫的方法就是doPost,doPut,doGet之類的方法,在Servlet原理講到的service() init()方法都不用重寫。比如在example.jsp中,你提交表單訪問Example(Servlet)

<form action="Example" method="post">
    <input type="submit" value="submit"/>
</form>

Server(你建立的tomcat伺服器)會呼叫init(),然後呼叫service(),然後service()呼叫doPost(),doGet()。當然,我這裡的表單method=”post”,
重寫doPost方法就可以了。

在web.xml中配置servlet
Web.xml是配置web專案基本資訊的檔案
配置servlet欄位:

   <servlet>
<!--Servlet名字,用於表單action屬性-->
     <servlet-name></servlet-name>
<!--Servlet具體實現類路徑-->
     <servlet-class>包名.子包名.實現類名</servlet-class>
   </servlet>

<servlet-mapping>
          <servlet-name
>
</servlet-name> <!--這裡的"/"指的是servlet根目錄,這是必須的,指的是訪問servlet的url連結--> <url-pattern>/servletname</url-pattern> </servlet-mapping>

雖然配置servlet的文章很多很多。但是這個<url-pattern>指的是什麼?都說是這個servlet可以處理的url。我真正做的時候,才知道,就是在表單action屬性裡面填的東西。

後臺資料傳到前臺?

假設現在有一個數據表dbo.user

怎麼從把資料庫獲取的資料放到前臺頁面?

   username varchar(20);    
   password  varchar(20);
   id   int identity(1,1) primary key;   

連線資料庫的EJB(Java Bean)連線SQL Server:

public class DBInfo {
       //This is a EJB that connects the DataBase
       private static String userName="";
       private static String password="";
       private static String DBURL="jdbc:sqlserver://localhost:1433;DatabaseName=DBuser";
       private static String DMInfo="com.microsoft.sqlserver.jdbc.SQLServerDriver";//DriverManager's class in DBService provider
       //these Field are Connection Component
       public static Statement command;
       public static Connection connection;


       //Load the DriverManager
       private static void LoadDM() throws ClassNotFoundException{
            try{
                 Class.forName(DMInfo);
            }catch(ClassNotFoundException e){
                 e.printStackTrace();
            }

       }


       //connect to the DataBase
       public static void InitSystem() throws SQLException{
               //Load the DriverManager
             try{
               LoadDM();
             }catch(ClassNotFoundException excep){
                 excep.printStackTrace();
             }
              //Load End


              try{
                    connection=DriverManager.getConnection(DBURL,userName,password);
                    command=connection.createStatement();

                }catch(SQLException e){
                    System.out.println("SYSTEM ERROR");
                    e.printStackTrace();
                }

       }

}

連線資料庫之後,我們希望把user的各種資訊顯示到display.jsp

Session物件能夠儲存物件屬性。並且直到瀏覽器視窗關閉,JSP內建物件Session一直存在,用於儲存多頁面跳轉時的引數。


       ResultSet result=statement.executeQuery(sql);
       User[] userList=new user[listlength];
       int i;
       while(result.next()){

 userList[i].setAttribute (result.getString("fieldName"));
            //  ……
      }
//doPost/doGet方法中
  //現在你需要的物件列表儲存在userList
         HttpSession session=request.getSession();

        session.setAttribute("list",userList);
   //跳轉到display.jsp頁面
         response.sendRedirect("display.jsp");

dispaly.jsp


         <%
         User[] userlist=(User[])session.getAttrbute("list");
       //do something "userlist"

      %>
      <%for(int i=0;i<userlist.length;i++){
      %>
      <p><%=user[i].username%></p>
      <p><%=user[i].password%></p>
      <%}%>

這些程式碼基本可以連成一條線了,讀取資料的時候存成user(EJB)模式.

前臺頁面怎麼傳遞資料到後臺?

我喜歡的是用form表單提交給相應的servlet,然後在Servlet可以呼叫EJB進行儲存

<form action="example" method="post">
<input type="text" name="username">
<input type="submit" value="submit"/>
</form>

提交到example(servlet)中在servlet的doPost方法中,你就可以呼叫響應的EJB,把資料庫存到資料庫。

public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
    /**這裡的getParameter通過表單的name屬性**/
    String username=request.getParameter("username");
    //do something
}

PLUS
通常提交表單之前,要通過JS做一些事情。JS和Java是無法進行直接資料交換的,需要通過HTML DOM元素。



<form id="user" name="userform" action="" method="">
   <button onclick="deal()"></button>
</form>
<script>
 var deal=function(){
     var userForm=document.getElementById("user");
     //do something
     userForm.submit();//此時提交表單

 }
</script>

上述通過JS來提交表單,將把資料送到相應的Servlet,但是這不代表JS能夠和後臺溝通。而是因為JS傳送了一個HTTP請求。HTTP請求在後臺Servlet容器會呼叫相應的Servlet處理客戶端瀏覽器請求。

雖然JS和Java無法進行值交換,但是,可以通過表單隱藏域,將資料提交給JS。

<input type="hidden" id="transmiss" value=<%=userlist[i].username%> >

<script>
var trans=document.getElementById("transmiss");
var text=trans.value;
</script>