Servlet技術應用核心節點訓練
1.掌握HttpServlet中的主要方法
2.掌握HttpRequest,HttpResponse的應用
3.掌握ServletConfig對象和ServletContext對象的概念
#### **2.1、Servlet簡介**
Servlet就是sun公司開發動態web的一門技術
Sun在這些API中提供一個接口叫做:Servlet,如果你想開發一個Servlet程序,只需要完成兩個小 步驟:
* 編寫一個類,實現Servlet接口
* 把開發好的Java類部署到web服務器中。
**把實現了Servlet接口的Java程序叫做Servlet**
#### **2.2、HelloServlet**
Serlvet接口Sun公司有兩個默認的實現類:HttpServlet,GenericServlet
1.構建一個普通的Maven項目,刪掉里面的src目錄,以后我們的學習就在這個項目里面建立Moudel;這個空的工程就是Maven主工程;
2.關于Maven父子工程的理解:
父項目中會有
```
? ?<modules>
? ? ? ?<module>servlet-01</module>
? ?</modules>
```
子項目會有
```
? ?<parent>
? ? ? ?<artifactId>javaweb-02-servlet</artifactId>
? ? ? ?<groupId>com.kuang</groupId>
? ? ? ?<version>1.0-SNAPSHOT</version>
? ?</parent>
```
父項目中的java子項目可以直接使用
```
son extends father
```
3. Maven環境優化
>1. 修改web.xml為最新的
>2. 將maven的結構搭建完整
4. 編寫一個Servlet程序

>1. 編寫一個普通類
>2. 實現Servlet接口,這里我們直接繼承HttpServlet
```
public class HelloServlet extends HttpServlet {
? ?//由于get或者post只是請求實現的不同的方式,可以相互調用,業務邏輯都一樣;
? ?@Override
? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?//ServletOutputStream outputStream = resp.getOutputStream();
? ? ? ?PrintWriter writer = resp.getWriter(); //響應流
? ? ? ?writer.print("Hello,Serlvet");
? }
? ?@Override
? ?protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?doGet(req, resp);
? }
}
```
5. 編寫Servlet的映射
為什么需要映射:我們寫的是JAVA程序,但是要通過瀏覽器訪問,而瀏覽器需要連接web服務器, 所以我們需要再web服務中注冊我們寫的Servlet,還需給他一個瀏覽器能夠訪問的路徑;
```
? ?<!--注冊Servlet-->
? ?<servlet>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
? ?</servlet>
? ?<!--Servlet的請求路徑-->
? ?<servlet-mapping>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<url-pattern>/hello</url-pattern>
? ?</servlet-mapping>
```
6. 配置Tomcat
注意:配置項目發布的路徑就可以了
7. 啟動測試,OK!
#### **2.3、Servlet原理**
Servlet是由Web服務器調用,web服務器在收到瀏覽器請求之后,會:

#### **2.4、Mapping問題**
1.一個Servlet可以指定一個映射路
```
? ?<servlet-mapping>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<url-pattern>/hello</url-pattern>
? ?</servlet-mapping>
```
2. 一個Servlet可以指定多個映射路徑
```
? ?<servlet-mapping>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<url-pattern>/hello</url-pattern>
? ?</servlet-mapping>
? ?<servlet-mapping>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<url-pattern>/hello2</url-pattern>
? ?</servlet-mapping>
? ?<servlet-mapping>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<url-pattern>/hello3</url-pattern>
? ?</servlet-mapping>
? ?<servlet-mapping>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<url-pattern>/hello4</url-pattern>
? ?</servlet-mapping>
? ?<servlet-mapping>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<url-pattern>/hello5</url-pattern>
? ?</servlet-mapping>
```
3. 一個Servlet可以指定通用映射路徑
```
? ?<servlet-mapping>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<url-pattern>/hello/*</url-pattern>
? ?</servlet-mapping>
```
4. 默認請求路徑
```
? ?<!--默認請求路徑-->
? ?<servlet-mapping>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<url-pattern>/*</url-pattern>
? ?</servlet-mapping>
```
5. 指定一些后綴或者前綴等等….
```
<!--可以自定義后綴實現請求映射
? ?注意點,*前面不能加項目映射的路徑
? ?hello/sajdlkajda.qinjiang
? ?-->
<servlet-mapping>
? ?<servlet-name>hello</servlet-name>
? ?<url-pattern>*.qinjiang</url-pattern> </servlet-mapping>
```
6. 優先級問題
指定了固有的映射路徑優先級最高,如果找不到就會走默認的處理請求;
```
<!--404-->
<servlet>
? ?<servlet-name>error</servlet-name>
? ?<servlet-class>com.kuang.servlet.ErrorServlet</servlet-class> </servlet>
<servlet-mapping>
? ?<servlet-name>error</servlet-name>
? ?<url-pattern>/*</url-pattern>
</servlet-mapping>
```
#### **2.5、ServletContext**
web容器在啟動的時候,它會為每個web程序都創建一個對應的ServletContext對象,它代表了當前的 web應用;
**1、共享數據**
我在這個Servlet中保存的數據,可以在另外一個servlet中拿到;
```
public class HelloServlet extends HttpServlet {
? ?@Override
? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?//this.getInitParameter() ? 初始化參數
? ? ? ?//this.getServletConfig() ? Servlet配置
? ? ? ?//this.getServletContext() Servlet上下文
? ? ? ?ServletContext context = this.getServletContext(); ? ?
? ? String username = "秦疆"; //數據
? ? ? ?context.setAttribute("username",username); //將一個數據保存在了 ServletContext中,名字為:username 。值 username
}
}
```
```
public class GetServlet extends HttpServlet {
? ?@Override
? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?ServletContext context = this.getServletContext();
? ? ? ?String username = (String) context.getAttribute("username");
? ? ? ?resp.setContentType("text/html");
? ? ? ?resp.setCharacterEncoding("utf-8");
? ? ? ?resp.getWriter().print("名字"+username);
}
? ?@Override
? ?protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?doGet(req, resp);
? }
}
```
```
? ?<servlet>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
? ?</servlet>
? ?<servlet-mapping>
? ? ? ?<servlet-name>hello</servlet-name>
? ? ? ?<url-pattern>/hello</url-pattern>
? ?</servlet-mapping>
```
```
? ?<servlet>
? ? ? ?<servlet-name>getc</servlet-name>
? ? ? ?<servlet-class>com.kuang.servlet.GetServlet</servlet-class>
? ?</servlet>
? ?<servlet-mapping>
? ? ? ?<servlet-name>getc</servlet-name>
? ? ? ?<url-pattern>/getc</url-pattern>
? ?</servlet-mapping>
```
**測試訪問結果;
2、獲取初始化參數**
```
? ?<!--配置一些web應用初始化參數-->
? ?<context-param>
? ? ? ?<param-name>url</param-name>
? ? ? ?<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
? ?</context-param>
```
```
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ?ServletContext context = this.getServletContext();
? ?String url = context.getInitParameter("url");
? ?resp.getWriter().print(url);
}
```
**3、請求轉發**
```
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ?ServletContext context = this.getServletContext();
? ?System.out.println("進入了ServletDemo04");
? ?//RequestDispatcher requestDispatcher =
context.getRequestDispatcher("/gp"); //轉發的請求路徑
? ?//requestDispatcher.forward(req,resp); //調用forward實現請求轉發;
? ?context.getRequestDispatcher("/gp").forward(req,resp);
}
```

**4、讀取資源文件**
Properties
* 在java目錄下新建properties
* 在resources目錄下新建properties
發現:都被打包到了同一個路徑下:classes,我們俗稱這個路徑為classpath:
思路:需要一個文件流;
```
username=root12312
password=zxczxczxc
```
```
public class ServletDemo05 extends HttpServlet {
? ?@Override
? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");
? ? ? ?Properties prop = new Properties();
? ? ? ?prop.load(is);
? ? ? ?String user = prop.getProperty("username");
? ? ? ?String pwd = prop.getProperty("password");
? ? ? ?resp.getWriter().print(user+":"+pwd);
}
? ?@Override
? ?protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?doGet(req, resp);
? }
}
```
訪問測試即可ok;
#### **2.6、HttpServletResponse**
web服務器接收到客戶端的http請求,針對這個請求,分別創建一個代表請求的HttpServletRequest對 象,代表響應的一個HttpServletResponse;
如果要獲取客戶端請求過來的參數:找HttpServletRequest
如果要給客戶端響應一些信息:找HttpServletResponse
**1、簡單分類**
負責向瀏覽器發送數據的方法
```
ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException;
```
負責向瀏覽器發送響應頭的方法
```
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1,long var2);
void addDateHeader(String var1,long var2);
void setHeader(String var1,String var2);
void addHeader(String var1,String var2);
void setIntHeader(String var1,int var2);
void addIntHeader(String var1,int var2);
```
響應的狀態碼
```
? ?int SC_CONTINUE = 100;
? ?int SC_SWITCHING_PROTOCOLS = 101;
? ?int SC_OK = 200;
? ?int SC_CREATED = 201;
? ?int SC_ACCEPTED = 202;
? ?int SC_NON_AUTHORITATIVE_INFORMATION = 203;
? ?int SC_NO_CONTENT = 204;
? ?int SC_RESET_CONTENT = 205;
? ?int SC_PARTIAL_CONTENT = 206;
? ?int SC_MULTIPLE_CHOICES = 300;
? ?int SC_MOVED_PERMANENTLY = 301;
? ?int SC_MOVED_TEMPORARILY = 302;
? ?int SC_FOUND = 302;
? ?int SC_SEE_OTHER = 303;
? ?int SC_NOT_MODIFIED = 304;
? ?int SC_USE_PROXY = 305;
? ?int SC_TEMPORARY_REDIRECT = 307;
? ?int SC_BAD_REQUEST = 400;
? ?int SC_UNAUTHORIZED = 401;
? ?int SC_PAYMENT_REQUIRED = 402;
? ?int SC_FORBIDDEN = 403;
? ?int SC_NOT_FOUND = 404;
? ?int SC_METHOD_NOT_ALLOWED = 405;
? ?int SC_NOT_ACCEPTABLE = 406;
? ?int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
? ?int SC_REQUEST_TIMEOUT = 408;
? ?int SC_CONFLICT = 409;
? ?int SC_GONE = 410;
? ?int SC_LENGTH_REQUIRED = 411;
? ?int SC_PRECONDITION_FAILED = 412;
? ?int SC_REQUEST_ENTITY_TOO_LARGE = 413;
? ?int SC_REQUEST_URI_TOO_LONG = 414;
? ?int SC_UNSUPPORTED_MEDIA_TYPE = 415;
? ?int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
? ?int SC_EXPECTATION_FAILED = 417;
? ?int SC_INTERNAL_SERVER_ERROR = 500;
? ?int SC_NOT_IMPLEMENTED = 501;
? ?int SC_BAD_GATEWAY = 502;
? ?int SC_SERVICE_UNAVAILABLE = 503;
? ?int SC_GATEWAY_TIMEOUT = 504;
? ?int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
```
**2、下載文件**
1. 向瀏覽器輸出消息 (一直在講,就不說了)
2. 下載文件
>1. 要獲取下載文件的路徑
>2. 下載的文件名是啥?
>3. 設置想辦法讓瀏覽器能夠支持下載我們需要的東西
>4. 獲取下載文件的輸入流
>5. 創建緩沖區
>6. 獲取OutputStream對象
>7. 將FileOutputStream流寫入到bu?er緩沖區
>8. 使用OutputStream將緩沖區中的數據輸出到客戶端!
```
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ?// 1. 要獲取下載文件的路徑
? ?String realPath = "F:\\班級管理\\西開【19525】\\2、代碼\\JavaWeb\\javaweb-02-servlet\\response\\target\\classes\\秦疆.png";
? ?System.out.println("下載文件的路徑:"+realPath);
? ?// 2. 下載的文件名是啥?
? ?String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
? ?// 3. 設置想辦法讓瀏覽器能夠支持(Content-Disposition)下載我們需要的東西,中文文件 名URLEncoder.encode編碼,否則有可能亂碼
? ?resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
? ?// 4. 獲取下載文件的輸入流
? ?FileInputStream in = new FileInputStream(realPath);
? ?// 5. 創建緩沖區
? ?int len = 0;
? ?byte[] buffer = new byte[1024];
? ?// 6. 獲取OutputStream對象
? ?ServletOutputStream out = resp.getOutputStream();
? ?// 7. 將FileOutputStream流寫入到buffer緩沖區,使用OutputStream將緩沖區中的數據 輸出到客戶端!
? ?while ((len=in.read(buffer))>0){
? ? ? ?out.write(buffer,0,len);
? }
? ?in.close();
? ?out.close();
}
```
**3、驗證碼功能**
驗證怎么來的? 前端實現
后端實現,需要用到 Java 的圖片類,生產一個圖片
```
package com.kuang.servlet;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class ImageServlet extends HttpServlet {
? ?@Override
? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?//如何讓瀏覽器3秒自動刷新一次;
? ? ? ?resp.setHeader("refresh","3");
? ? ? ?//在內存中創建一個圖片
? ? ? ?BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
? ? ? ?//得到圖片
? ? ? ?Graphics2D g = (Graphics2D) image.getGraphics(); //筆
? ? ? ?//設置圖片的背景顏色
? ? ? ?g.setColor(Color.white);
? ? ? ?g.fillRect(0,0,80,20);
? ? ? ?//給圖片寫數據
? ? ? ?g.setColor(Color.BLUE);
? ? ? ?g.setFont(new Font(null,Font.BOLD,20));
? ? ? ?g.drawString(makeNum(),0,20);
? ? ? ?//告訴瀏覽器,這個請求用圖片的方式打開
? ? ? ?resp.setContentType("image/jpeg");
? ? ? ?//網站存在緩存,不讓瀏覽器緩存
? ? ? ?resp.setDateHeader("expires",-1);
? ? ? ?resp.setHeader("Cache-Control","no-cache");
? ? ? ?resp.setHeader("Pragma","no-cache");
? ? ? ?//把圖片寫給瀏覽器
? ? ? ?ImageIO.write(image,"jpg", resp.getOutputStream());
}
? ?//生成隨機數
? ?private String makeNum(){
? ? ? ?Random random = new Random();
? ? ? ?String num = random.nextInt(9999999) + "";
? ? ? ?StringBuffer sb = new StringBuffer();
? ? ? ?for (int i = 0; i < 7-num.length() ; i++) {
? ? ? ? ? ?sb.append("0");
? ? ? }
? ? ? ?num = sb.toString() + num;
? ? ? ?return num;
? }
? ?@Override
? ?protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?doGet(req, resp);
? }
}
```
**4、實現重定向**

B一個web資源收到客戶端A請求后,B他會通知A客戶端去訪問另外一個web資源C,這個過程叫重定向 常見場景:
* 用戶登錄
```
void sendRedirect(String var1) throws IOException;
```
測試:
```
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ?/*
? ? ? ?resp.setHeader("Location","/r/img");
? ? ? ?resp.setStatus(302);
? ? ? ? */
? ?resp.sendRedirect("/r/img");//重定向
}
```
面試題:請你聊聊重定向和轉發的區別? 相同點
頁面都會實現跳轉
不同點
請求轉發的時候,url不會產生變化 重定向時候,url地址欄會發生變化;

**5、簡單實現登錄重定向**
```
<%--這里提交的路徑,需要尋找到項目的路徑--%>
<%--${pageContext.request.contextPath}代表當前的項目--%>
<form action="${pageContext.request.contextPath}/login" method="get">
? 用戶名:<input type="text" name="username"> <br>
? 密碼:<input type="password" name="password"> <br>
? ?<input type="submit">
</form> ?
?@Override
? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ? ? ?//處理請求
? ? ? ?String username = req.getParameter("username");
? ? ? ?String password = req.getParameter("password");
? ? ? ?System.out.println(username+":"+password);
? ? ? ?//重定向時候一定要注意,路徑問題,否則404;
? ? ? ?resp.sendRedirect("/r/success.jsp");
? }
```
```
?<servlet>
? ?<servlet-name>requset</servlet-name>
? ?<servlet-class>com.kuang.servlet.RequestTest</servlet-class>
?</servlet>
?<servlet-mapping>
? ?<servlet-name>requset</servlet-name>
? ?<url-pattern>/login</url-pattern>
?</servlet-mapping>
```
```
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html>
<head>
? ?<title>Title</title>
</head>
<body>
<h1>Success</h1>
</body> </html>
```
#### **2.7、HttpServletRequest**
HttpServletRequest代表客戶端的請求,用戶通過Http協議訪問服務器,HTTP請求中的所有信息會被封 裝到HttpServletRequest,通過這個HttpServletRequest的方法,獲得客戶端的所有信息;

**獲取參數,請求轉發**

```
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
? ?req.setCharacterEncoding("utf-8");
? ?resp.setCharacterEncoding("utf-8");
? ?String username = req.getParameter("username");
? ?String password = req.getParameter("password");
? ?String[] hobbys = req.getParameterValues("hobbys");
? ?System.out.println("=============================");
? ?//后臺接收中文亂碼問題
? ?System.out.println(username);
? ?System.out.println(password);
? ?System.out.println(Arrays.toString(hobbys));
? ?System.out.println("=============================");
? ?System.out.println(req.getContextPath());
? ?//通過請求轉發
? ?//這里的 / 代表當前的web應用
? ?req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
```
面試題:請你聊聊重定向和轉發的區別?
相同點
* 頁面都會實現跳轉
不同點
* 請求轉發的時候,url不會產生變化 307
* 重定向時候,url地址欄會發生變化; 302
- Java Web項目開發學習手冊
- 一、B/S開發環境搭建
- 1.1 tomcat服務器目錄結構及作用
- 1.2 在IDE開發工具上配置tomcat服務器
- 1.3 簡單web項目在tomcat服務器上運行的方法
- 1.4 開發工具設置
- 1.5 總結
- 二、Servlet技術應用
- 2.1 HttpServlet中的主要方法及應用
- 2.1.1 基于Eclipse完成一個JavaWeb項目
- 2.2 HttpRequest,HttpResponse的應用
- 2.2.1客戶端請求
- 2.2.2服務器響應
- 2.2.3Servlet HTTP 狀態碼
- 2.2.4圖片驗證碼類
- 2.2.5注冊模擬實現(帶驗證碼)
- 2.3 ServletConfig對象和ServletContext對象的概念
- 2.4 總結
- 三、JSP技術應用
- 3.1 JSP基本語法
- 3.2 JSP標簽和指令
- 3.3 JSP中的隱式對象
- 3.4 常用應用操作
- 3.4.1 JSP客戶端請求
- 3.4.2 JSP服務器響應
- 3.4.3 HTTP狀態碼
- 3.4.4 表單處理
- 3.4.5 過濾器
- 3.4.6 Cookie處理
- 3.4.7 Session處理
- 3.4.8 文件上傳
- 3.4.9 日期處理
- 3.4.10 頁面重定向
- 3.4.11 點擊量統計
- 3.4.12 自動刷新
- 3.4.13 發送郵件
- 3.5 JSP高級應用
- 3.5.1 JSP標準標簽庫(JSTL)
- 3.5.2 JSP連接數據庫
- 3.5.3 JSP XML數據處理
- 3.5.4 JSP JavaBean
- 3.5.5 自定義標簽
- 3.5.6 表達式語言
- 3.5.7 異常處理
- 3.5.8 調試
- 3.5.9 JSP國際化
- 3.6 實踐代碼
- 3.6.1 實踐代碼
- 3.6.2 項目實戰
- 3.7 總結
- 四、MVC思想的理解和搭建MVC
- 4.1 MVC設計模式的思想
- 4.2 MVC設計模式的實現步驟
- 4.3 項目實踐
- 4.4 總結
- 五、EL表達式和JSTL技術
- 5.1 EL表達式及其應用
- 5.2 常用的JSTL標簽的應用
- 5.3 項目實踐
- 5.4 總結
- 六、Cookie和Session
- 6.1 cookie對象的概念和應用
- 6.2 session對象的概念和應用
- 6.3 項目實踐
- 6.4 總結
- 七、過濾器技術應用
- 7.1 Filter的概念及應用
- 7.2 Filter、FilterChain、FilterConfig 介紹
- 7.3 用戶登錄過濾案例
- 7.4 項目實戰
- 7.5總結
- 八、異步請求技術
- 8.1 JSON數據格式
- 8.2 使用AJAX實現異步請求
- 8.3 用戶名校驗案例
- 8.4小結
- 綜合項目技術實訓
- 1.BS項目開發項目實戰
- 2.項目需求分析和系統設計
- 2.1需求分析
- 2.2類型模型設計
- 2.3原型設計
- 3.項目數據庫分析和系統設計
- 4.BS項目編程實現
- 4.1搭建框架和命名規約
- 4.2實現步驟
- 4.2.1創建實體類
- 4.2.2創建過濾器類
- 4.2.3創建工具類
- 4.2.4創建DAO接口及其實現類
- 4.2.5創建Service接口及其實現類
- 4.2.6創建測試類
- 4.2.7創建控制器類
- 5.企業開發流程規范
- 6.總結
- 九、練習題及答案
- 企業開發常用技術
- 1.Maven技術
- Java命名規范解讀
- 參考資料
- 開發中常用的應用服務器和Web服務器