Servlet

一、Applet是由Java語言編寫的小應用程序,能夠包含在HTML頁面中,用<applet></applet>來標記。javascript

二、Applet工做原理css

  當瀏覽器遇到<applet></applet>這樣的標籤的時候,就會處理Applet程序,但前提是瀏覽器是支持Java的。html

  當用戶訪問這樣的網頁的時候,Applet應用程序是被下載到客戶的本地計算機內的,而後再執行。java

  Applet具備設計精美用戶界面的優點。web

  Applet有很大的安全限制。小程序

三、Servlet是在服務器上運行的小程序,而Applet是隨着網頁一塊兒打包到客戶端,在客戶端上執行。因爲是在服務器端運行,因此能夠用java語言來實現,在通訊量大的狀況下,javaServlet的執行速度是快於CGI(公共網關接口)的。瀏覽器

四、最先支持Servlet的是JSP,後來不少技術都支持了Servlet API接口,Servlet能夠交互式地瀏覽和修改數據。安全

五、Servlet的實現過程服務器

  客戶端發送請求到服務器端;session

  服務器將請求發給Servlet;

  Servlet生成相應內容並將響應內容發送給服務器;

  服務器將響應返回給客戶端。

六、Servlet只初始化一次,由於只有一個對象。

七、Servlet和Applet的相同的和不一樣點:相同點是他們都不是獨立的應用程序,沒有main()主函數,它們都是被另外的程序(容器)調用的,不一樣點是Servet沒有圖形用戶界面,在服務器端運行,而Applet有很好的圖形用戶界面而且與瀏覽器在客戶端運行。

八、Servlet和CGI:前者比後者有更好的性能、移植性和經濟性。

九、Servlet常見的容器:Apache、Websphere等等,提供Servlet功能的服務器叫Servlet容器。容器比如是桌面應用程序對於的操做系統同樣。

十、Servlet與JSP:Servlet是一句一句地輸出HTML語句,而JSP像PHP,ASP那樣是鑲嵌型的語言。Servlet方便與寫業務層,而JSP方便於寫表現層。通常,JSP只用於寫表現層的東西,而業務層的東西用javaBean來寫。能夠說JSP是Servlet的替代方案,但通常的學習者仍是須要從Servlet開始學,而後學JSP,最後是JSP+BEAN。

十一、Servlet能夠方便地對Web中的HTTP請求進行處理,Servlet主要用於處理各類業務邏輯。Servlet主要應用與B/S結構的開發中。一般狀況下咱們編寫的Servlet對象都繼承於HttpServlet。

十二、建立Servlet有兩種方法:一是建立一個Java類,而後實現Servlet接口或者繼承於Servlet接口的實現類(HttpServlet)來實現;另外一種是經過IDE集成開發環境。繼承HttpServlet實現的Servlet對象重寫了HttpServlet類中的部分方法。

1三、建立Servlet後還須要對其進行配置,目的是將建立的Servlet註冊到Servlet容器之中,以方便Servlet容器對Servlet的調用。Servlet3.0及之後版本中能夠在web.xml和註解中配置。前者須要本身配置,後者在Eclipse下自動完成配置。前者以下:

<!--註冊Servlet-->
<servlet>
    <!--Servlet描述信息-->
    <description>This is my first Servlet</description>
    <!--Servlet的名稱-->
    <servlet-name>FirstServlet</servlet-name>
    <!--Servlet類的完整類名-->
    <servlet-class>com.joeshine.FirstServlet</servlet-class>
</servlet>
<!--Servlet映射-->
<servlet-mapping>
    <!--Servlet名稱-->
    <servlet-name>FirstServlet</servlet-name>
    <!--訪問URL地址-->    
    <url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>

1四、在Servlet中實現頁面轉發:利用RequestDispatcher接口實現。該接口有兩個方法:

  forward()方法:用於將請求轉發到服務器上的另外一個資源,能夠是Servlet、JSP或HTML;

  include()方法:用於把服務器上的另外一個資源(Servlet,JSP,HTML)包含到響應中。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        RequestDispatcher requestdispatcher=request.getRequestDispatcher("main.jsp");
        requestdispatcher.forward(request, response);
    }

1五、用Servlet處理表單數據

ServletFormDeal.java文件

 1 package com.joeshine;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import javax.servlet.ServletException;
 6 import javax.servlet.annotation.WebServlet;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 /**
12  * Servlet implementation class ServletFormDeal
13  */
14 @WebServlet("/ServletFormDeal")
15 public class ServletFormDeal extends HttpServlet {
16     private static final long serialVersionUID = 1L;
17        
18     /**
19      * @see HttpServlet#HttpServlet()
20      */
21     public ServletFormDeal() {
22         super();
23         // TODO Auto-generated constructor stub
24     }
25 
26     /**
27      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
28      */
29     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
30         // TODO Auto-generated method stub
31         request.setCharacterEncoding("UTF-8");        //設置請求編碼,防止中文亂碼
32         String person=request.getParameter("person");    //獲取留言人
33         String content=request.getParameter("content"); //獲取留言內容
34         response.setContentType("text/html;charset=utf-8");//設置內容類型
35         PrintWriter out=response.getWriter();            //建立輸出流
36         out.println("<html><head><title>獲取留言信息</title></head><body>");
37         out.println("留言人:&nbsp;"+person+"<br><br>");
38         out.println("留言內容:"+content+"<br><br>");
39         out.println("<a href='index.jsp'>返回</a>");
40         out.println("</body></html>");
41         out.close();                                  //關閉輸出流
42     }
43 
44 }

index.jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用Servlet處理表單信息</title>
</head>
<body>
<form name="form1" method="post" action="ServletFormDeal">
留言人:&nbsp;<input type="text" name="person"><br><br>
留言內容:<textarea name="content" rows="6" cols="30" ></textarea><br><br>
<input type="submit" name="submit1" value="提交">
<input type="reset" name="submit2" value="重置">
</form>
</body>
</html>

1六、Servlet過濾器:它和Servlet十分類似,是針對客戶端(瀏覽器)請求資源而言的。它主要是將客戶端(瀏覽器)的請求進行過濾後轉交給下一個資源。其實質上就是在Web應用服務器上的Web應用組件,用於攔截客戶端(瀏覽器)和目標資源的請求。過濾器能夠有多個構成過濾器鏈,經過層次請求轉交後達到目標資源,而後層層響應傳到客戶端。

1七、過濾器的核心對象:過濾器的對象都放在javax.servlet包中,Filter接口對象、FilterConfig接口對象、FilterChain接口對象。每個過濾器都要直接或間接地實現Filter接口對象,其包括三個方法init()初始化過濾器、doFilter()對請求進行過濾處理、destroy()銷燬方法;FilterConfig對象由Servlet容器實現,主要用於獲取過濾器中的配置信息,其有四個方法;FilterChain接口對象也由Servlet容器實現,其只有一個方法,就是將過濾後的請求傳遞給下一個過濾器。

1八、過濾器的建立和配置,相似於Servlet

 1 package com.joeshine;
 2 //過濾器的建立和配置
 3 import java.io.IOException;
 4 import javax.servlet.Filter;
 5 import javax.servlet.FilterChain;
 6 import javax.servlet.FilterConfig;
 7 import javax.servlet.annotation.*;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.annotation.WebFilter;
12 
13 /**
14  * Servlet Filter implementation class FirstFilter
15  */
16 /*過濾器的配置代碼,filterName屬性是指定Servlet過濾器名,urlPatterns屬性用於指定哪些URL應用該過濾器,
17 ,若是全部頁面均使用則設爲"/*",iniParams屬性用於指定初始化參數。這些屬性不是必須的,能夠在須要的時候選擇使用
18 */
19 @WebFilter(filterName="/FirstFilter",
20 urlPatterns={"/*"},
21 initParams={@WebInitParam(name="mood",value="awake")})
22 public class FirstFilter implements Filter {
23 
24     /**
25      * Default constructor. 
26      */
27     public FirstFilter() {
28         // TODO Auto-generated constructor stub
29     }
30 
31     /**
32      * @see Filter#destroy()
33      */
34     public void destroy() {
35         // TODO Auto-generated method stub
36     }
37 
38     /**
39      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
40      */
41     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
42         // TODO Auto-generated method stub
43         // place your code here,放置過濾器代碼的地方
44 
45         // pass the request along the filter chain
46         chain.doFilter(request, response);
47     }
48 
49     /**
50      * @see Filter#init(FilterConfig)
51      */
52     public void init(FilterConfig fConfig) throws ServletException {
53         // TODO Auto-generated method stub
54     }
55 
56 }

1九、使用過濾器實現網站訪問次數的功能

CountFilter.java

 1 package com.joeshine;
 2 //建立CountFilter類過濾器,實現javax.servlet.FilterJiek ,用於實現統計網站訪問人數
 3 import java.io.IOException;
 4 import javax.servlet.annotation.*;
 5 import javax.servlet.ServletContext;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.annotation.WebFilter;
12 
13 /**
14  * Servlet Filter implementation class Filter
15  */
16 //在過濾器配置信息裏初始化count計數器參數,保證過濾器編譯後count還能夠更改
17 @WebFilter(filterName="/Filter",
18         urlPatterns="/index.jsp",
19         initParams={
20                 @WebInitParam(name="count",value="3000")
21 })
22 public class CountFilter implements javax.servlet.Filter {
23 
24     /**
25      * Default constructor. 
26      */
27     //定義一個計數器變量
28     private int count;
29     public CountFilter() {
30         // TODO Auto-generated constructor stub
31     }
32 
33     /**
34      * @see Filter#destroy()
35      */
36     public void destroy() {
37         // TODO Auto-generated method stub
38     }
39 
40     /**
41      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
42      */
43     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
44         // TODO Auto-generated method stub
45         //doFilter方法攔截客戶端的請求
46         // place your code here
47         //計數器自加運算
48         count++;
49         //用FiterConfig的獲取過濾器
50         ServletContext context=request.getServletContext();
51         //未來訪數量值放入ServletContext中
52         context.setAttribute("count", count);
53         //向下傳遞過濾器
54         // pass the request along the filter chain
55         chain.doFilter(request, response);
56     }
57 
58     /**
59      * @see Filter#init(FilterConfig)
60      */
61     public void init(FilterConfig fConfig) throws ServletException {
62         // TODO Auto-generated method stub
63         //獲取初始化參數
64         String param=fConfig.getInitParameter("count");
65         //將字符串轉換爲Int型
66         count=Integer.valueOf(param);
67     }
68 
69 }

index.jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>
    歡迎光臨,<br>
    您是本站的第【<%=application.getAttribute("count") %>
    】位訪客!
</h2>
</body>
</html>

20、Servlet監聽器:Servlet監聽器和Servlet過濾器的不少特性是一致的,甚至與過濾器的不少概念也是一致的。監聽器的做用是堅挺Web容器的有效期事件,所以它是由容器管理的。Servlet和JSP中有8個Listener接口和6個Event類。功能是監聽因爲Web應用中狀態改變而引發的Servlet容器產生的相應事件,而後接受並處理這些事件。

2一、Servlet監聽器分爲幾大類

  1)  Servlet上下文監聽能夠監聽ServletContex對象

    ServletContextListener接口:該接口存放在javax.servlet包中,主要監聽ServletContext對象的建立和刪除,它提供兩個方法,參數是Event類,稱爲「Web應用程序的生命週期方法」。

    ServletAttributeListener接口:存放在javax.servlet包中,主要監聽ServletContext屬性的增長、刪除、修改。該接口提供了三個方法,參數是Event類。

  2)   HTTP會話監聽:主要用於監聽信息。4個接口可使用。

    HttpSessionListener接口:用於監聽HTTP會話的建立、銷燬。提供了兩個方法,參數是HttpSessionEvent類。

    HttpSessionActivationListener接口:用於監聽HTTP會話active、passivate的狀況。提供了三個方法,參數是HttpSessionBindingEvent類,該類有三個方法。

    HttpBindingListener接口:用於監聽HTTP會話中對象的綁定信息,它是惟一一個不須要在web.xml中設定Listener的。提供兩個方法,參數是HttpSessionBindingEvent類。

    HttpSessionAttributeListener接口:用於監聽HTTP會話中屬性的設置請求。提供兩種方法,參數是HttpSessionEvent類。

  3)  HTTP請求監聽:監聽客戶端的請求,一旦能夠在監聽程序中獲取客戶端的請求,就能夠對請求統一處理。

    ServletRequestListener接口:提供了兩個方法;

    ServletRequestAttributeListener接口:提供了三種方法。

2二、Servlet監聽器實例:統計在人數

UserInfoList.java

 1 package com.joeshine;
 2 
 3 import java.util.Vector;
 4 
 5 public class UserInfoList {
 6     private static UserInfoList user = new UserInfoList();
 7     private Vector<String> vector = null;
 8 
 9     /*
10      * 利用private調用構造函數, 防止被外界產生新的instance對象
11      */
12     public UserInfoList() {
13         this.vector = new Vector<>();
14     }
15 
16     /* 外界使用的instance對象 */
17     public static UserInfoList getInstance() {
18         return user;
19     }
20 
21     /* 增長用戶 */
22     public boolean addUserInfo(String user) {
23         if (user != null) {
24             this.vector.add(user);
25             return true;
26         } else {
27             return false;
28         }
29     }
30 
31     /* 獲取用戶列表 */
32     public Vector<String> getList() {
33         return vector;
34     }
35 
36     /* 移除用戶 */
37     public void removeUserInfo(String user) {
38         if (user != null) {
39             vector.removeElement(user);
40         }
41     }
42 }

UserInfoTrace.java類

 1 package com.joeshine;
 2 
 3 import javax.servlet.http.HttpSessionBindingEvent;
 4 
 5 public class UserInfoTrace implements
 6         javax.servlet.http.HttpSessionBindingListener {
 7     private String user;
 8     private UserInfoList container = UserInfoList.getInstance();    //得到UserInfoList類的對象
 9 
10     public UserInfoTrace() {
11         user = "";
12     }
13 
14     // 設置在線監聽人員
15     public void setUser(String user) {
16         this.user = user;
17     }
18 
19     // 獲取在線監聽
20     public String getUser() {
21         return this.user;
22     }
23     //當Session有對象加入時執行的方法
24     public void valueBound(HttpSessionBindingEvent arg0) {
25         System.out.println("[ " + this.user + " ]上線");
26     }
27     //當Session有對象移除時執行的方法
28     public void valueUnbound(HttpSessionBindingEvent arg0) {
29         System.out.println("[ " + this.user + " ]下線");
30         if (user != "") {
31             container.removeUserInfo(user);
32         }
33     }
34 }

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用戶登陸</title>
<script language="javascript">
    function checkEmpty(form) {
        for (i = 0; i < form.length; i++) {
            if (form.elements[i].value == "") {
                alert("表單信息不能爲空");
                return false;
            }
        }
    }
</script>
<style type="text/css">
section {
    margin:0 auto auto auto;            /*設置外邊距*/
    width:363px;                        /*設置頁面寬度*/
    clear:both;                        /*設置兩側均不能夠有浮動內容*/
    background-image:url(images/login.png);            /*設置背景圖片*/
    height:224px;                        /*設置高度*/
}
form{
    padding-left: 80px;        /*設置左內邊距*/
    padding-top: 120px;        /*設置上內邊距*/
}
body{
    margin: 0px;
}
</style>
</head>
<body>
<section>

 
  <form name="form" method="post" action="showuser.jsp" onSubmit="return checkEmpty(form)">
    <input type="text" name="user">
    <input type="submit" name="Submit" value="登陸">
  </form>

</section>
</body>
</html>

logout.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" errorPage="" %>
<%
         session.invalidate();
 out.println("<script>parent.location.href='index.jsp';</script>");
%>

showUser.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="com.mingrisoft.*"%>
<%
    UserInfoList list = UserInfoList.getInstance();//得到UserInfoList類的對象
    UserInfoTrace ut = new UserInfoTrace();//建立UserInfoTrace類的對象
    request.setCharacterEncoding("UTF-8");//設置編碼爲UTF-8,解決中文亂碼
    String name = request.getParameter("user");    //獲取輸入的用戶名
    ut.setUser(name);    //設置用戶名
    session.setAttribute("list", ut);
    list.addUserInfo(ut.getUser());    //添加用戶到UserInfo類的對象中
    session.setMaxInactiveInterval(30);//設置Session的過時時間爲30秒
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>在線用戶列表</title>

<style type="text/css">
section {
    margin:0 auto auto auto;            /*設置外邊距*/
    width:311px;                        /*設置頁面寬度*/
    clear:both;                        /*設置兩側均不能夠有浮動內容*/
    background-image:url(images/listbg.png);            /*設置背景圖片*/
    height:254px;                        /*設置高度*/
}
textarea{
    border: none;    /*設置不顯示邊框*/
    background-color: #FDF7E9;    /*設置背景顏色*/
    margin-left: 20px;
    margin-top: 100px;
    padding: 0px;    /*設置內邊距*/
}
body{
    margin: 0px;    /*設置外邊距*/
}
</style>
</head>
<body>
<section>
<div>
    <textarea rows="10" cols="34"><%
        Vector vector = list.getList();
        if (vector != null && vector.size() > 0) {
            for (int i = 0; i < vector.size(); i++) {
                out.println(vector.elementAt(i));
            }
        }
    %>
    </textarea>
</div>
</section>
</body>
</html>

2三、編寫一個字符編碼過濾器,使得全部的表單數據輸入支持中文,並編寫一個Servlet類輸出request獲取的數據。實例爲添加圖書信息並輸出:

index.jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首頁</title>
<style type="text/css">
    ul{
        list-style:none;
    }
    li{
        padding:4px;
    }
</style>
</head>
<body>
<!-- 實現圖書信息的添加,並建立字符編碼過濾器,避免中文亂碼 -->
<form name="form" method="post" action="AddServlet">
<ul>
    <li>圖書編號:<input type="text" name="id"></li>
    <li>圖書名稱:<input type="text" name="name"></li>
    <li>&nbsp;&nbsp;格:<input type="text" name="price"></li>
    <li>&nbsp;&nbsp;者:<input type="text" name="author"></li>
    <li><input type="submit" name="submit" value="添加"></li>
</ul>
</form>
</body>
</html>

CharactorFilter.java類(字符編碼過濾器)

 1 package com.joeshien;
 2 //建立字符編碼過濾器類CharactorFilter
 3 import java.io.IOException;
 4 import javax.servlet.annotation.*;
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.annotation.WebFilter;
12 
13 /**
14  * Servlet Filter implementation class CharactorFilter
15  */
16 @WebFilter(filterName="/CharactorFilter",
17             urlPatterns={"/*"},
18             initParams={
19                     @WebInitParam(name="encoding",value="UTF-8")
20             })
21 public class CharactorFilter implements Filter {
22     String encoding=null;        //定義字符編碼字符串變量
23     /**
24      * Default constructor. 
25      */
26     public CharactorFilter() {
27         // TODO Auto-generated constructor stub
28     }
29 
30     /**
31      * @see Filter#destroy()
32      */
33     public void destroy() {
34         // TODO Auto-generated method stub
35         encoding=null;
36     }
37 
38     /**
39      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
40      */
41     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
42         // TODO Auto-generated method stub
43         // place your code here
44         if(encoding!=null)                    //判斷字符編碼是否爲空
45         {
46             //設置請求的編碼格式
47             request.setCharacterEncoding(encoding);
48             //設置響應response的編碼
49             response.setContentType("text/html; charset="+encoding);
50         }
51         // pass the request along the filter chain
52         chain.doFilter(request, response);
53     }
54 
55     /**
56      * @see Filter#init(FilterConfig)
57      */
58     public void init(FilterConfig fConfig) throws ServletException {
59         // TODO Auto-generated method stub
60         encoding=fConfig.getInitParameter("encoding");    //獲取初始化參數
61     }
62 
63 }

AddServlet.java(增長圖書信息的Servlet類)

 1 package com.joeshien;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import javax.servlet.ServletException;
 6 import javax.servlet.annotation.WebServlet;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 /**
12  * Servlet implementation class AddServlet
13  */
14 @WebServlet("/AddServlet")  //配置SERVLET
15 public class AddServlet extends HttpServlet {
16     private static final long serialVersionUID = 1L;
17        
18     /**
19      * @see HttpServlet#HttpServlet()
20      */
21     public AddServlet() {
22         super();
23         // TODO Auto-generated constructor stub
24     }
25 
26     /**
27      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
28      */
29     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
30         // TODO Auto-generated method stub
31         doPost(request,response);  //處理GET請求
32     }
33 
34     /**
35      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
36      */
37     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
38         // TODO Auto-generated method stub
39         PrintWriter out=response.getWriter();               //獲取PrintWriter
40         String id=request.getParameter("id");               //獲取圖書編號
41         String name=request.getParameter("name");        //獲取圖書名稱
42         String price=request.getParameter("price");        //獲取圖書價格
43         String author=request.getParameter("author");    //獲取圖書做者
44         out.print("<h2>圖書信息添加成功</h2>");             //輸出圖書信息
45         out.print("圖書編號:"+id+"<br><br>");
46         out.print("圖書名稱:"+name+"<br><br>");
47         out.print("價&nbsp;&nbsp;格:"+price+"<br><br>");
48         out.print("做&nbsp;&nbsp;者:"+author);
49         out.flush();
50         out.close();
51     }
52 
53 }
相關文章
相關標籤/搜索