我們先來看看SERVLET程序的基本構架:
式1:
package test;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class test extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int f =1; switch(f){
case 1:firstMothed(request,respponse);break;
}
}
public void firstMothed(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
OutputStreamWriter osw = new
OutputStreamWriter(response.getOutputStream());
PrintWriter out = new PrintWriter (response.getOutputStream());
out.println("< html>");
out.println("< head>< title>Servlet1< /title>< /head>");
out.println("< body>你好!");
out.println("< /body>< /html>");
out.close();
}
}
式2:
package test;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class test extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream());
PrintWriter out = new PrintWriter (response.getOutputStream());
out.println("< html>");
out.println("< head>< title>Servlet1< /title>< /head>");
out.println("< body>你好!");
out.println("< /body>< /html>");
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream());
PrintWriter out = new PrintWriter (response.getOutputStream());
out.println("< html>");
out.println("< head>< title>Servlet1< /title>< /head>");
out.println("< body>你好!");
out.println("< /body>< /html>");
out.close();
}
}
式1適合於作總控模塊,此SERVLET作中間調度,根據不同的f值調用不同的SERVLET或方法。
式2適合於對html的get和post有不同要求的情況。
但這並不是絕對的,式2就完全可以代替式1,只要在doGet()方法中寫上doPost就與式1完全一樣。
在init方法中執行的語句,只要這個servlet被啓動了就一直有效,比如,我們在init()中new了一個對象,那麼這個對象的內存空間就永遠存在,除非顯式地把這個對象賦爲null,或重啓服務。
HttpServletRequest和HttpServletResponse兩個對象實現http請求,它們有很多有用的方法,在下面的cookie和session管理中會細加描述。
1, cookie管理 cookie用於在客戶端保存個人所特有的信息,它採取在客戶機寫臨時文件的機制。
package test;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class test extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//寫cookie
String CookieName ="js79"; //若是漢字則需編碼
String CookieValue = "yesky";//若是漢字則需編碼
Cookie cookie = new Cookie(CookieName,CookieValue);
cookie.setMaxAge(age); // age = Integer.MAX_VALUE 永不過期
cookie.setPath("/");
//讀cookie
String value = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i=0; i< cookies.length; i++) {
if (cookies[i].getName().equals(CookieName))
value = cookies[i].getValue();
break;
}
}
}
response.setContentType("text/html");
OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream());
PrintWriter out = new PrintWriter (response.getOutputStream());
out.println("< html>");
out.println("< head>< title>test< /title>< /head>");
out.println("cookie鍵:"+CookieName+"< br>");
out.println("cookie值: "+value);
out.println("< /body>< /html>");
out.close();
}
}
2,session管理
Session在Servlet中是很有用的,它比cookie安全可靠靈活,但是管理起來有點麻煩,用得不好會造成服務器的開銷很大,浪費資源。下面是一個基於Session管理一個對象的簡單例子。
一個簡單的bean對象TestObject
package test;
public class TestObject extends Object {
int id = 0; public String cur="";
}
package test;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class TestMan extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int f = 1;
if(request.getParameter("f")!=null)
f =
Integer.parseInt(request.getParameter("f"));
switch(f){
case 1: this.getResult(request,response);
break;
case 2:
this.setSession(request,response);
break;
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
public void getResult(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
TestObject testObject = null;
testObject = getStatus(request,response);
String html = testObject.id; doWrite( response,html);
}
public void setSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
TestObject testObject = null;
testObject = getStatus(request,response);
String tmp = null;
tmp = request.getParameter("id");
if(tmp != null) testObject.id = tmp;
session.putValue("testObject ",article);
getResult(request,response);
}
private TestObject getStatus(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
TestObject testObject = null;
if(session!=null){
if(session.getValue("testObject ")!=null){
testObject = (TestObject)session.getValue("testObject ");
}
else{
testObject = new TestObject ();
}
}
else{
testObject = new TestObject ();
}
return testObject;
}
private void doWrite(HttpServletResponse response,String html) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println(html);
out.close();
}
/////////////////////////////////////////////////////////
}
若能輕鬆搞定上面的例子,相信讀者對SERVLET已有了較爲深刻的理解。
下面再介紹一個上傳文件例子,其中汲及到了下載的免費JavaBean (如有感興趣的朋友,可來函索要免費JavaBean源代碼,Email:[email protected])
上傳基本原理:由頁面發出一個http請求,服務端得到請求後,解析多媒體協議,讀出文件內容,寫文件內容到服務器,所有的這些功能都封裝到JavaBean中。
上傳文件的必需條件:Browser端< form>表單的ENCTYPE屬性值必須爲 multipart/form-data,它告訴我們傳輸的數據要用到多媒體傳輸協議,由於多媒體傳輸的都是大量的數據,所以規定上傳文件必須是post方法,< input>的type屬性必須是file。
package upload;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class UpLoadServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("< HTML>< HEAD>< TITLE>UpLoad< /TITLE>"
+"< meta http-equiv=´Content-Type´ content=´text/html; charset=gb2312´>"
+"< /HEAD>"
+"< body>");
out.println("< div align=´center´ valign=´top´>"
+"< span class=´nava´>請你選擇上傳的文件(請注意文件大小只能在20K之內)< /span>< BR>"
+"< form ENCTYPE=´multipart/form-data´ method=post action=´´>"
+"< input type=´file´ name=´file´>"
+"< input type=´submit´ value=´發送´>"
+"< /form>"
+"< /div>");
out.println("< /body>< /html>");
out.close();
}
////////
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
int tmpID = 1; try {
MultipartRequest multi = new MultipartRequest(request,"/home/js79/html/", 5 * 1024 * 1024);
}
catch(Exception e){
tmpID = -1; System.out.println(e);
}
if(tmpID == 1){
out.println("< HTML>< HEAD>< TITLE>UpLoad< /TITLE>"
+"< meta http-equiv=´Content-Type´ content=´text/html; charset=gb2312´>"
+"< /HEAD>"
+"< body>");
out.println("上傳成功!< /body>< /html>");
}
else{
out.println("< HTML>< HEAD>< TITLE>UpLoad< /TITLE>"
+"< meta http-equiv=´Content-Type´ content=´text/html; charset=gb2312´>"
+"< /HEAD>"
+"< body>");
out.println("上傳不成功!< /body>< /html>");
}
out.close();
}
}