天天看點

Java Web簡明教程–Servlet篇[3]–擷取網頁資料

1, 簡單示範get方式傳參方法(因為get傳參本來就比較簡單)

2,比較詳細示範表單通過post方式傳參(表單也可以通過get傳參,參見上一篇)

首先說下get傳參,為了示範get傳參這個事情,我們先得有個Servlet,那就建立一個ParameterPassDemoServlet(貓哥的英文一貫維持在較高水準)。相關代碼如下:

<!-- web.xml節選-->

 <servlet>

   <servlet-name>ParameterPassDemoServlet</servlet-name>

   <servlet-class>servlet.ParameterPassDemoServlet</servlet-class>

 </servlet>

 <servlet-mapping>

   <url-pattern>/ParameterPassDemoServlet</url-pattern>

 </servlet-mapping>

1

2

3

4

5

6

7

8

9

是以我們可以通過通路

http://127.0.0.1:8080/ServletDemo/ParameterPassDemoServlet

來通路ParameterPassDemoServlet。

好的,通過get方式傳參數非常簡單,在URL位址後面加上?param1=XXX¶m2=XXX就行了。

比如要查詢三班有多少學生,可以這樣設計

http://127.0.0.1:8080/ServletDemo/ParameterPassDemoServlet?class=3

。(注意此處沒有寫class=三班,是因為使用URL傳遞參數時一般不要在URL寫漢字,另外也不要寫班級名稱而是寫班級在資料庫中對應的id,想想為啥,想不通也沒關系,以後就慢慢明白了,至于傳遞中文參數的問題,本篇後面會講的)。

OK,此時我們這樣設計Servlet就可以得到參數class:

package servlet;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class ParameterPassDemoServlet extends HttpServlet {//用于示範參數傳遞的Servlet類

public ParameterPassDemoServlet() {

 super();

}

public void doGet(HttpServletRequest request, HttpServletResponse response)

  throws ServletException, IOException {//處理get請求

 response.setContentType("text/html");

 PrintWriter out = response.getWriter();

 String inputClass=request.getParameter("class");//擷取輸入的參數class

 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");

 out.println("<HTML>");

 out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");

 out.println("  <BODY>");

 out.print("class:"+inputClass);//輸出

 out.println("  </BODY>");

 out.println("</HTML>");

 out.flush();

 out.close();

}

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

測試後網頁輸出:class:3,顯然我們的ParameterPassDemoServlet擷取到了浏覽器用戶端位址裡面包含的參數。

之是以能如此簡單的就擷取到了前台輸入的參數,還是因為HttpServletRequest request,這個doGet()方法的參數,它封裝了網頁請求這個模型,你可以認為request對象裡面儲存的就是網頁請求的資訊,而request.getParameter("XXX");的意思就是從網頁請求資訊裡面得到名為XXX的參數的值。

同理,如果在html網頁中有<a href="http://127.0.0.1:8080/ServletDemo/ParameterPassDemoServlet?class=3"></a>,同樣可以通過點選這個連結實作同樣的效果。

因為前一篇說過需要知道第一個/表示127.0.0.1:8080/,是以要先寫項目名後寫Servlet映射名(/FirstAutoServlet)。

是以其實可以簡寫為<a href="/ServletDemo/ParameterPassDemoServlet?class=3"></a>。

前面啰嗦了這麼多,總算把get傳參這個事情說完了,大家也發現了吧,get方式傳參洩漏了很多天機啊,你看那class=3,洩露了我們的參數名class,還洩露了一個可能是在資料庫裡存在的值。是以啊,還是Post傳參好,安全性更高,接下來我們示範下POST傳參。

第一步,我們得有個網頁,用來送出參數,那就叫inputParameter.html吧,代碼如下:

<!DOCTYPE html>

<html>

 <head>

   <title>inputParameter.html</title>

 </head>

 <body>

    <form name="mainForm" method="post" action="/ServletDemo/ParameterPassDemoServlet">

    姓名:<input type="text" name="name"></input>

    <br/>

    班級:<select name="class">

     <option value="1">1班</option>

     <option value="2">2班</option>

     <option value="3">3班</option>

    </select>

    性别:<input type="radio" name="sex" value="man" checked="checked"/>男

    <input type="radio" name="sex" value="women"/>女

    特長:<input type="checkbox" name=checkBasketball value="basketball"/>籃球

    <input type="checkbox" name="checkFootball" value="football"/>足球

    <input type="submit"></input>

   </form>

 </body>

</html>

25

我們還是穿參數給ParameterPassDemoServlet,然後注意method="post"指明了我們要用post方法傳遞參數,然後我們在網頁上分别放置了一個文本框、一個下拉框、2個單選按鈕和2個複選框。分别簡單說明下:

文本框:name="name",是以Servlet使用"name"作為參數名來取文本框的輸入内容

複選框:name="class"表示複選框名稱,注意value屬性,選擇一班的話,背景取到的值應該是1而不是1班,1班隻是顯示值。

單選按鈕:name="sex",注意兩個單選按鈕都叫"sex",說明它倆是一夥的,也就是說這倆最多隻有一個被選中。由于第一個單選按鈕有checked="checked",表示預設選中。取值的話,如果選中第一個單選按鈕,取到的值應該是"man",注意男就是個文本,跟單選按鈕都沒鳥關系,就像注釋一樣。

複選框,同樣,按name取,背景取到的值為對應的value值。

好的,我們修改ParameterPassDemoServlet的doPost方法如下:

public void doPost(HttpServletRequest request, HttpServletResponse response)

  throws ServletException, IOException {//處理post請求

 response.setContentType("text/html");//設定輸入格式

 PrintWriter out = response.getWriter();//out用于輸出

 //擷取參數,注意nothing參數是不存在的,看看會發生什麼

 String name=request.getParameter("name");

 String myclass=request.getParameter("class");

 String sex=request.getParameter("sex");

 String checkBasketball=request.getParameter("checkBasketball");

 String checkFootball=request.getParameter("checkFootball");

 String nothing=request.getParameter("nothing");

 //輸出擷取的參數,驗證擷取是否成功

 out.print("name:"+name+"<br/>");

 out.print("myclass:"+myclass+"<br/>");

 out.print("sex:"+sex+"<br/>");

 out.print("checkBasketball:"+checkBasketball+"<br/>");

 out.print("checkFootball:"+checkFootball+"<br/>");

 out.print("nothing:"+nothing+"<br/>");

Java Web簡明教程–Servlet篇[3]–擷取網頁資料

點選送出,頁面顯示:

Java Web簡明教程–Servlet篇[3]–擷取網頁資料

這裡面就有幾個問題了:

1,擷取到的name的值是亂碼,說明我們的字元集設定有問題

2,checkFootball的值是null,說明複選框如果不選的話,得到的值為null,注意不是空字元串

3,nothing的值是null,說明如果參數名不存在,得到的值是null

需要注意,如果文本框不輸入内容,得到的不是null而是空字元串。而單選按鈕和下拉清單因為有預設選中項,倒是不必擔心初始值是null還是空字元串的問題。(null和空字元串是不一樣的哦,null可以認為就沒有初始化,而空字元串是初始化了的一個字元串,空的字元串就像0似的,也是有意義的)。

好了,現在我們了解決下亂碼的問題,對于編碼貓哥了解也不深,但是貓哥知道,編碼無非就以下幾處,都改成支援中文的utf-8不就OK了:

1,在網頁處設定編碼,可以在<head>标簽下添加 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

2,在Servlet處,設定request.setCharacterEncoding("utf-8");和response.setCharacterEncoding("utf-8");這樣輸入、輸出都是utf-8編碼。

3,在Java語言和資料庫互動處的資料庫連接配接字元串設定:String url = "jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=utf-8";//資料庫連接配接字元串

OK,此處我們隻用到1、2條,修改後重試,果然OK了。好了,不用大家費心了,源碼奉上:

   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

26

public void doPost(HttpServletRequest request, HttpServletResponse response)

 request.setCharacterEncoding("utf-8");

 response.setCharacterEncoding("utf-8");