JavaWeb網站用Servlet實現前後臺互動
現在很多網站都用框架開發,不過為了奠定基礎,我在這裡記錄下在沒有框架的條件下進行網站開發的總結.
基本框架:
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>