# **一、本節任務:使用MVC模式完成框架搭建**
在現有項目的src目錄下分別創建如下包。
包的命名規范為:com.姓名漢語拼音**加學號后三位**.功能模塊英文名稱
比如:com.baishenghua100.pojo
**1.創建pojo包**
**com.baishenghua100.pojo**
**2.創建utils包**
**com.baishenghua100.utils**
**3.創建dao包**
**com.baishenghua100.dao**
**4.創建dao的實現包impl**
**com.baishenghua100.dao.impl**
**5.創建controller包**
**com.baishenghua100.controller**
**6.創建services包**
**com.baishenghua100.services**
**7.創建services包的實現包impl**
**com.baishenghua100.services.impl**
**8.創建測試包test**
**com.baishenghua100.test**
**9.創建過濾器包filter**
**com.baishenghua100.filter**
然后分別在各個包下創建對應的類和接口
# **二、具體實現步驟:**
**1.創建pojo包**
**com.baishenghua100.pojo**
>創建導航菜單類Menu100.java
三個屬性:菜單名稱、菜單地址和菜單序號。屬性名上也加上學號后三位
重寫hashCode()和equals()方法
重寫toString()方法
實現可序列化接口
創建有參和無參構造方法

```
package com.baishenghua100.pojo;
import java.io.Serializable;
/**
* Menu100.java(導航菜單類)
* @desc 導航菜單
* @author 柏圣華
* @date 2021-10-21
*
*/
public class Menu100 implements Serializable{
private static final long serialVersionUID = 1L;
private int menuNo100;//導航菜單序號
private String menuName100;//導航菜單名稱
private String menuURL100;//導航菜單地址
public Menu100() {
super();
}
public Menu100(int menuNo100, String menuName100, String menuURL100) {
super();
this.menuNo100 = menuNo100;
this.menuName100 = menuName100;
this.menuURL100 = menuURL100;
}
@Override
public String toString() {
return "Menu100 [menuNo100=" + menuNo100 + ", menuName100=" + menuName100 + ", menuURL100=" + menuURL100 + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((menuName100 == null) ? 0 : menuName100.hashCode());
result = prime * result + menuNo100;
result = prime * result + ((menuURL100 == null) ? 0 : menuURL100.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Menu100 other = (Menu100) obj;
if (menuName100 == null) {
if (other.menuName100 != null)
return false;
} else if (!menuName100.equals(other.menuName100))
return false;
if (menuNo100 != other.menuNo100)
return false;
if (menuURL100 == null) {
if (other.menuURL100 != null)
return false;
} else if (!menuURL100.equals(other.menuURL100))
return false;
return true;
}
public int getMenuNo100() {
return menuNo100;
}
public void setMenuNo100(int menuNo100) {
this.menuNo100 = menuNo100;
}
public String getMenuName100() {
return menuName100;
}
public void setMenuName100(String menuName100) {
this.menuName100 = menuName100;
}
public String getMenuURL100() {
return menuURL100;
}
public void setMenuURL100(String menuURL100) {
this.menuURL100 = menuURL100;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
```
**2.創建utils包**
**com.baishenghua100.utils**
>創建圖片驗證碼類,首先這個類是一個servlet。命名為:CheckCode100.java
參見圖片[驗證碼類](http://cms.yiniuedu.com/javawebstudy/2472193)

**3.創建dao包**
**com.baishenghua100.dao**
>創建IMenuDao100接口,里面定義增刪改查和一些復雜查詢方法
查詢所有菜單
根據條件查詢部分菜單
查詢指定的某個菜單
更新菜單
添加菜單
刪除菜單

```
package com.baishenghua100.dao;
import java.util.List;
import com.baishenghua100.pojo.Menu100;
/**
* IMenuDao100.java(導航菜單數據處理接口)
* @desc 主要定義一些方法:查詢所有導航菜單、條件查詢菜單、根據序號查詢導航菜單以及添加、修改和刪除菜單。
* @author 柏圣華
* @date 2021-10-21
*
*/
public interface IMenuDao100 {
public List<Menu100> queryAll100();//查詢所有導航菜單
public List<Menu100> queryByCond100(String condition100);//條件查詢導航菜單
public Menu100 query100(Menu100 menu100);//根據序號查詢導航菜單
public Menu100 add100(Menu100 menu100);//添加導航菜單
public Menu100 update100(Menu100 menu100);//修改導航菜單
public Menu100 delete100(Menu100 menu100);//刪除導航菜單
}
```
**4.創建dao的實現包impl**
**com.baishenghua100.dao.impl**
>創建IMenuDao100接口的實現類MenuDaoImpl100類,并實現接口里面的所有方法

```
package com.baishenghua100.dao.impl;
import java.util.List;
import com.baishenghua100.dao.IMenuDao100;
import com.baishenghua100.pojo.Menu100;
/**
* MenuDaoImpl100.java(導航菜單數據處理具體實現類)
* @desc 主要實現接口里面的增刪改查的方法,比如說,查詢所有導航菜單、條件查詢菜單以及添加、修改和刪除菜單。
* @author 柏圣華
* @date 2021-10-21
*
*/
public class MenuDaoImpl100 implements IMenuDao100 {
@Override
public List<Menu100> queryAll100() {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Menu100> queryByCond100(String condition100) {
// TODO Auto-generated method stub
return null;
}
@Override
public Menu100 query100(Menu100 menu100) {
// TODO Auto-generated method stub
return null;
}
@Override
public Menu100 add100(Menu100 menu100) {
// TODO Auto-generated method stub
return null;
}
@Override
public Menu100 update100(Menu100 menu100) {
// TODO Auto-generated method stub
return null;
}
@Override
public Menu100 delete100(Menu100 menu100) {
// TODO Auto-generated method stub
return null;
}
}
```
**5.創建controller包**
**com.baishenghua100.controller**
>創建MenuServlet100

```
package com.baishenghua100.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* MenuServlet100.java(導航菜單控制器類)
* @desc 主要控制導航菜單模型數據和視圖展示
* @author 柏圣華
* @date 2021-10-21
*
*/
@WebServlet("/MenuServlet100")
public class MenuServlet100 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MenuServlet100() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
```
**6.創建services包**
**com.baishenghua100.services**
>創建IMenuService100接口

```
package com.baishenghua100.services;
import java.util.List;
import com.baishenghua100.pojo.Menu100;
/**
* IMenuService100.java(導航菜單數據處理服務接口)
* @desc 主要定義一些方法,比如說,查詢所有導航菜單、條件查詢菜單以及添加、修改和刪除菜單。
* @author 柏圣華
* @date 2021-10-21
*
*/
public interface IMenuService100 {
public List<Menu100> queryAll100();//查詢所有導航菜單
public List<Menu100> queryByCond100(String condition100);//條件查詢導航菜單
public Menu100 query100(Menu100 menu100);//根據序號查詢導航菜單
public Menu100 add100(Menu100 menu100);//添加導航菜單
public Menu100 update100(Menu100 menu100);//修改導航菜單
public Menu100 delete100(Menu100 menu100);//刪除導航菜單
}
```
**7.創建services包的實現包impl**
**com.baishenghua100.services.impl**
>創建MenuServiceImpl100實現IMenuService100接口

```
package com.baishenghua100.services.impl;
import java.util.List;
import com.baishenghua100.pojo.Menu100;
import com.baishenghua100.services.IMenuService100;
/**
* MenuServiceImpl100.java(導航菜單數據處理服務具體實現類)
* @desc 主要調用IMenDao100接口里面的方法,具體調用IMenDao100接口實現類MenuDaoImpl100類里面的方法
* @author 柏圣華
* @date 2021-10-21
*
*/
public class MenuServiceImpl100 implements IMenuService100 {
IMenuDao100 iMenuDao100 = new MenuDaoImpl100();
@Override
public List<Menu100> queryAll100() {
return iMenuDao100.queryAll100();
}
@Override
public List<Menu100> queryByCond100(String condition100) {
return iMenuDao100.queryByCond100(condition100);
}
@Override
public Menu100 query100(Menu100 menu100) {
return iMenuDao100.query100(menu100);
}
@Override
public Menu100 add100(Menu100 menu100) {
return iMenuDao100.add100(menu100);
}
@Override
public Menu100 update100(Menu100 menu100) {
return iMenuDao100.update100(menu100);
}
@Override
public Menu100 delete100(Menu100 menu100) {
return iMenuDao100.delete100(menu100);
}
}
```
**8.創建測試包test**
**com.baishenghua100.test**
>創建MenuServiceImpl100的測試類MenuServiceImplTest100
創建一個JUnit Test case,名字為MenuServiceImplTest100
在class under test下選擇MenuServiceImpl100這個類,然后選擇要測試哪些方法

```
package com.baishenghua100.test;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/**
* MenuServiceImplTest100.java(導航菜單數據處理服務具體實現類的測試類)
* @desc 主要測試實現類MenuServiceImpl100類里面的方法,有沒有實現
* @author 柏圣華
* @date 2021-10-21
*
*/
class MenuServiceImplTest100 {
@BeforeEach
void setUp() throws Exception {
}
@AfterEach
void tearDown() throws Exception {
}
@Test
void testQueryAll100() {
fail("Not yet implemented");
}
@Test
void testQueryByCond100() {
fail("Not yet implemented");
}
@Test
void testQuery100() {
fail("Not yet implemented");
}
@Test
void testAdd100() {
fail("Not yet implemented");
}
@Test
void testUpdate100() {
fail("Not yet implemented");
}
@Test
void testDelete100() {
fail("Not yet implemented");
}
}
```
**9.創建過濾器包filter**
**com.baishenghua100.filter**
>創建字符編碼過濾器類CharacterEncodingFilter100類
注意此處要創建一個Filter

```
package com.baishenghua100.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* CharacterEncodingFilter100.java(字符編碼過濾器類)
* @desc 主要統一字符編碼
* @author 柏圣華
* @date 2021-10-21
*
*/
@WebFilter(urlPatterns="/*",initParams= {@WebInitParam(name="CharsetEncoding",value="utf-8")})
public class CharacterEncodingFilter100 implements Filter {
private static String encoding;//定義變量接收初始化的值
/**
* Default constructor.
*/
public CharacterEncodingFilter100() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
//設置字符編碼鏈鎖
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
//接收web.xml配置文件中或者注解中的初始參數
encoding = fConfig.getInitParameter("CharsetEncoding");
}
}
```
- 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服務器