springmvc學習知識總結
1.基礎概念+原理
springmvc:基於MVC模式的一個WEB框架,是spring框架中的一個模組。
MVC模式:Model-模型,View-檢視,Controller-控制器,是一種軟體設計模式。
https://www.cnblogs.com/xiaoxi/p/6164383.html springmvc的工作原理: 1.客戶端的請求將被前端控制器(DispatcherServlet)攔截。 2.前端控制器呼叫對映器(HandlerMapping)去查詢處理器(Controller)。 3.前端控制器呼叫介面卡(HandlerAdapter)去執行處理器。 4.處理器執行完後向介面卡返回模型檢視(ModelAndView)。 5.介面卡向前端控制器返回模型檢視。 6.前端控制器呼叫檢視解析器(ViewResolver)對模型檢視進行解析。 7.檢視解析器向前端控制器返回檢視(View)。 8.前端控制器對檢視進行渲染並響應給客戶端。
各個元件的作用詳解: 1.前端控制器(DispatcherServlet):接收請求,響應結果,類似於管家。 2.對映器(HandlerMapping):根據請求的url去查詢處理器。 3.處理器(Controller):需要編寫具體的處理邏輯。 4.介面卡(HandlerAdapter):支援各種型別的處理器。 5.模型檢視(ModelAndView):封裝Model和View物件。 6.檢視解析器(ViewResolver):進行檢視解析。 7.檢視(View):渲染具體資料的頁面。 一般情況下需要關注的元件:處理器(Controller)、檢視(View)。
2.開發步驟(1.2.3)
springmvc開發步驟: 1.匯入所需jar包:
2.在web.xml檔案中配置前端控制器(org.springframework.web.servlet.DispatcherServlet): <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 配置springmvc前端控制器(DispatcherServlet) --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet(固定)</servlet-class> <!-- 配置springmvc檔案的載入路徑(contextConfigLocation) --> <init-param> <param-name>contextConfigLocation(固定)</param-name> <param-value>classpath:config/springmvc.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
注:若不在web.xml檔案中配置contextConfigLocation初始化引數,則springmvc配置檔案必須在WEB-INF目錄下,且檔名必須為的值加上”-servlet.xml”,如springmvc-servlet.xml。
/:攔截不帶字尾名的請求以及帶字尾名的靜態資源(如.js、.css、 .png、.css、.jpg、.html等等,但不會攔截.jsp動態資源),會覆蓋tomcat的預設攔截配置。/*表示攔截所有請求,一般只用在過濾器上。
3.建立springmvc配置檔案,如:springmvc.xml。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.controller"/>
<!-- 開啟springmvc註解功能 -->
<mvc:annotation-driven/>
</beans>
3.建立控制器(Controller)
一、 建立控制器(Controller),三種方式。 A. 定義返回型別為ModelAndView的處理方法。 B. 定義返回型別為void的處理方法。 C. 定義返回型別為String的處理方法(常用)。
注:若要在控制器中請求非頁面資源且使用了檢視解析器時則只能用重定向或請求轉發。
檢視解析器用來返回邏輯檢視,需在springmvc檔案中配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver(固定)">
<property name="prefix(固定)" value="jsp/"/>
<property name="suffix(固定)" value=".jsp"/>
</bean>
配置檢視解析器後代碼修改如下:
二、控制器中方法的引數由spring容器自動注入: 1. 注入自帶型別,如Model、ModelMap、HttpServletRequest、HttpServletResponse、HttpSession等。
2. 注入簡單型別,處理方法的引數名需與請求的引數名一致,如String、String[]、int等。
3. 注入複雜型別,處理方法中引數的屬性名需與請求的引數名一致,如Shop等。
4. 注入List型別,需將繫結在物件上,而不能直接定義在處理方法的引數中,且處理方法中引數的List型別屬性名需與請求的引數名一致。
5. 注入Map型別,需在處理方法的引數中新增@RequestParam註解。
4.AJAX請求及JSON互動
AJAX請求及JSON互動: 1. 若需將處理方法的返回值以JSON格式返回,或將JSON格式的請求引數對映為處理方法引數的具體型別,則需以下jar包的支援。
2.若提交方式為POST,處理中文時則需在web.xml檔案中配置spring提供的過濾器。
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter(固定)</filter-class>
<init-param>
<param-name>encoding(固定)</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*(固定)</url-pattern>
</filter-mapping>
3. 若需引用外部js檔案,則需在springmvc配置檔案中新增靜態資源的訪問配置。
<!--
配置靜態資源的訪問
location:配置靜態資源所在物理路徑。
mapping:配置請求靜態資源的對映路徑。
**:匹配當前路徑及其子孫路徑。
-->
<mvc:resources location="/js/" mapping="/js/**"/>
4. 請求及響應。 響應字串:
響應實體:
響應Map:
響應List:
響應List
JSON請求引數對映為實體: //data為字串 type:“post”,//必須設定為post //Content-Type,內容型別,一般是指網頁中存在的Content-Type,用於定義網路檔案的型別和網頁的編碼 contentType:“application/json”,//必須設定該屬性
JSON請求引數對映為Map:
JSON請求引數對映為List<Pojo>:
JSON請求引數對映為List<Map>:
springmvc中的常用註解: @RequestMapping:配置請求與處理方法的對映,可用於類和方法上。 @RequestParam:配置請求引數與處理方法引數的對映,用於引數中。 @PathVariable:配置URL中的變數與處理方法引數的對映,支援restful請求風格(即不帶字尾和引數的請求),用於引數中。 restful //中文不可傳 //順序要保持一致,引數型別 @RequestMapping(“restful/{age}/{name}”) public String restful(@PathVariable String name,@PathVariable int age){ System.out.println(name+"="+age); return “”; } @RequestBody:配置json請求引數與處理方法引數的對映,用於引數中。 @ResponseBody:處理方法的返回值作為響應體。
5.JSON.stringify()
JavaScript JSON.stringify()
JSON.stringify() 方法用於將 JavaScript 值轉換為 JSON 字串。 語法 JSON.stringify(value[, replacer[, space]]) 引數說明: value: 必需, 要轉換的 JavaScript 值(通常為物件或陣列)。 replacer: 可選。用於轉換結果的函式或陣列。 如果 replacer 為函式,則 JSON.stringify 將呼叫該函式,並傳入每個成員的鍵和值。使用返回值而不是原始值。如果此函式返回 undefined,則排除成員。根物件的鍵是一個空字串:""。 如果 replacer 是一個數組,則僅轉換該陣列中具有鍵值的成員。成員的轉換順序與鍵在陣列中的順序一樣。當 value 引數也為陣列時,將忽略 replacer 陣列。 space: 可選,文字新增縮排、空格和換行符,如果 space 是一個數字,則返回值文字在每個級別縮排指定數目的空格,如果 space 大於 10,則文字縮排 10 個空格。space 有可以使用非數字,如:\t。 返回值: 返回包含 JSON 文字的字串。
6.Spring MVC @ResponseBody響應中文亂碼
7.攔截器
攔截器:用於對處理器進行預處理和後處理,常用於日誌記錄,許可權檢查,效能監控等。 實現步驟: 1.建立一個實現HandlerInterceptor介面,重寫介面中的方法。
2. 在springmvc配置檔案中新增攔截器配置。
<mvc:interceptors>
<!-- 多個攔截器則按配置的先後順序執行 -->
<mvc:interceptor>
<!-- /**:攔截所有及子url -->
<mvc:mapping path="/delete"/>
<bean class="com.interceptor.InterceptorDemo"/>
</mvc:interceptor>
</mvc:interceptors>
3.測試的處理器和jsp頁面。
8.檔案上傳下載
一、web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置springmvc前端控制器(DispatcherServlet) -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springmvc檔案的載入路徑(contextConfigLocation) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/springmvc.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置spring提供的字元編碼過濾器(針對post提交方式) -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
二、index.jsp
<%@ page pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>檔案上傳和下載</title>
</head>
<body>
<!-- 固定寫法:method="post" enctype="multipart/form-data" -->
<form action="upload" method="post" enctype="multipart/form-data">
檔案1:<input type="file" name="files"/><br/>
檔案2:<input type="file" name="files"/><br/>
<input type="submit" value="上傳"/>
</form>
<a href="filelist">檔案列表</a>
</body>
</html>
三、springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.controller"/>
<!-- 開啟springmvc註解功能 -->
<mvc:annotation-driven/>
<!-- 配置檔案上傳解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
</beans>
四、com.controller
@Controller
public class ControllerDemo {
@RequestMapping("/upload")
public String upload(@RequestParam MultipartFile[] files, HttpServletRequest request)
throws IllegalStateException, IOException {
// 獲取目錄名的絕對路徑
String path = request.getSession().getServletContext().getRealPath("upload");
// 建立資料夾物件
File dir = new File(path);
if(files != null) {
for(MultipartFile file : files) {
// 獲取上傳的檔名(檔名+字尾名)
String fileName = file.getOriginalFilename();
if(!file.isEmpty()) {
File dest = new File(dir, fileName);
// 上傳檔案
file.transferTo(dest);
}
}
}
return "index.jsp";
}
@RequestMapping("/filelist")
public String filelist(HttpServletRequest request) {
// 獲取目錄名的絕對路徑
String path = request.getSession().getServletContext().getRealPath("upload");
// 建立資料夾物件
File dir = new File(path);
// 獲取該路徑下的所有檔案和目錄名
String[] fileNameArr = dir.list();
// 將所有的檔名以逗號(,)拼接
StringBuilder sb = new StringBuilder();
for(String fileName : fileNameArr) {
if(sb.length() != 0) {
sb.append(",");
}
sb.append(fileName);
}
request.setAttribute("fileNames", sb.toString());
return "show.jsp";
}
@RequestMapping("/download/{fileName}")
public ResponseEntity<byte[]> download(@PathVariable String fileName,
HttpServletRequest request) throws IOException {
// 解決檔名中文問題
fileName = new String(fileName.getBytes("iso-8859-1"), "utf-8");
// 獲取目錄名的絕對路徑
String path = request.getSession().getServletContext().getRealPath("upload");
// 構建下載的檔案物件
File file = new File(path, fileName);
// 解決下載時檔名的中文問題
String downloadFileName = new String(fileName.getBytes(), "iso-8859-1");
// 用來封裝響應頭資訊
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentDispositionFormData("attachment", downloadFileName);
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
byte[] b = FileUtils.readFileToByteArray(file);
ResponseEntity<byte[]> responseEntity =
new ResponseEntity<byte[]>(b, httpHeaders, HttpStatus.OK);
return responseEntity;
}
}
五、show.jsp
<%@ page pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>檔案上傳和下載</title>
<script type="text/javascript">
window.onload = function()
{
var html = [];
var fileNames = "${fileNames}";
var arr = fileNames.split(",");
for(var i=0; i<arr.length; i++)
{
html.push("<a href='download/" + arr[i] + "/'>" + arr[i] + "</a>");
}
var div = document.getElementById("div_list");
div.innerHTML = html.join("<br/>");
}
</script>
</head>
<body>
<div id="div_list"></div>
</body>
</html>
9.spring+springmvc+mybatis+ajax整合
1. 匯入所需jar包。
2. 匯入jquery的指令碼。
3. web.xml檔案配置。
4. 工程結構圖。
spring-bean.xml檔案內容:
spring-mvc.xml檔案內容:
spring.xml檔案內容:
注:在實際開發中一般用ContextLoaderListener監聽器來載入和初始化公共的bean,如DAO和Service層的bean。而DispatcherServlet只用來載入和初始化web相關的bean,如Controller、HandlerMapping、HandlerAdapter等。
web.xml檔案:
spring-bean.xml檔案內容:
springmvc.xml檔案內容:
10.web中靜態資源和動態資源的概念及區別
https://blog.csdn.net/u012110719/article/details/44239429 1.靜態資源和動態資源的概念 簡單來說: 靜態資源:一般客戶端傳送請求到web伺服器,web伺服器從記憶體在取到相應的檔案,返回給客戶端,客戶端解析並渲染顯示出來。 動態資源:一般客戶端請求的動態資源,先將請求交於web容器,web容器連線資料庫,資料庫處理資料之後,將內容交給web伺服器,web伺服器返回給客戶端解析渲染處理。 2.靜態資源和動態資源的區別 a.靜態資源一般都是設計好的html頁面,而動態資源依靠設計好的程式來實現按照需求的動態響應; b.靜態資源的互動性差,動態資源可以根據需求自由實現; c.在伺服器的執行狀態不同,靜態資源不需要與資料庫參於程式處理,動態可能需要多個數據庫的參與運算。
l html:靜態資源 ,瀏覽器可以看得懂,它可以有變數; l JSP/Servlet:動態資源,需要先轉換成html,再給瀏覽器看。
11.出現的問題
無效的列索引; 原因:引數可能沒有傳過去
12.druid(用連線池配置資料來源)
資料庫賬號密碼加密
<!-- 配置資料來源DriverManagerDataSource 自帶的,實際開發中不用 -->
<!--實際開發中用連線池c3p0,db3p,druid-->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
</bean>
db.properties配置,如下:
jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.user=movie
#加密:java -cp druid-1.1.9.jar com.alibaba.druid.filter.config.ConfigTools 123(密碼)
#密碼是隨機的,在druid包頁面命令列中,複製貼上加密裡面的內容,然後run,之後複製密碼,拷貝到這邊的密碼中
jdbc.pwd=Vuanr8BSGqajX8dLQXF3ZkUrDH8HCR75BUqlObSa9viUBFqaMWeA357ESHjtiFi8CtyfunB9iUnOkR6qPIFgKw==
#初始連線數。
jdbc.initialSize=1
#最小連線池數量。
jdbc.minIdle=1
#最大連線池數量。
jdbc.maxActive=10
#獲取連線時最大等待時間(單位毫秒),這裡為1分鐘。
jdbc.maxWait=60000
#一個連線在池中的最小生存時間(單位毫秒)。
jdbc.minEvictableIdleTimeMillis=300000
#1.Destroy執行緒會檢測連線的間隔時間,即間隔多久才進行一次檢測需要關閉的空閒連線(單位毫秒)。
#2.testWhileIdle的判斷依據。
jdbc.timeBetweenEvictionRunsMillis=60000
#連線使用限制時間(單位秒),若有業務處理時間超過設定時間,可適當調整,這裡為1分鐘。
jdbc.removeAbandonedTimeout=60
#連線使用超過限制時間是否回收(不建議在生產環境中開啟)。
jdbc.removeAbandoned=true
#連接回收時控制檯列印資訊,測試環境可為true,生產環境false,會影響效能。
jdbc.logAbandoned=false
#用來檢測連線是否有效的sql,要求是一個查詢語句。
#如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle均無效。
#常用資料庫的validationQuery檢查語句:
#oracle:select 1 from dual
#mysql、sqlserver、ingres、derby、h2:select 1
#db2:select 1 from sysibm.sysdummy1
#hsqldb:select 1 from information_schema.system_users
#postgresql:select version()
jdbc.validationQuery=select 1 from dual
#申請連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能(預設true)。
jdbc.testOnBorrow=false
#歸還連線時執行validationQuery檢測連線是否有效,做了這個配置會降低效能(預設false)。
jdbc.testOnReturn=false
#建議配置為true,不影響效能,並且保證安全性。申請連線的時候檢測,如果空閒時間大於
#timeBetweenEvictionRunsMillis,執行validationQuery檢測連線是否有效(預設false)。
jdbc.testWhileIdle=true
#是否快取preparedStatement,也就是PSCache(預設false)。
#如果用oracle則配置為true,mysql為false。分庫分表較多的資料庫,建議配置為false。
jdbc.poolPreparedStatements=true
#指定每個連線上PSCache的大小
jdbc.maxPoolPreparedStatementPerConnectionSize=20
#通過別名的方式配置擴充套件外掛。
#常用的外掛有:監控統計:stat、日誌:log4j、防禦sql注入:wall。
#啟動服務後的監控訪問地址:http://ip:port/projectName/druid
jdbc.filters=stat,config
#解密,步驟1:filters=config、步驟2:config.decrypt.key為publicKey。
#(公共key也是隨機的,myEclipse+\,eclipse不+\)
jdbc.connectionProperties=config.decrypt=true;config.decrypt.key\=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJTdbQv0gde10olfxCjLC/a7Ba21Enf6MiS7OUIm7rfDBWih5roJXqGbf33nAFqY1yuKR3qHOwb9i+iHnqMVmqkCAwEAAQ==
13,加密+解密
//druid提供加解密
String pwd1=ConfigTools.encrypt("123");
String pwd2=ConfigTools.decrypt(pwd1);
@Test
public void xx1() throws Exception{
//druid提供加解密
String pwd1=ConfigTools.encrypt("123");
System.out.println(pwd1);
String pwd2=ConfigTools.decrypt(pwd1);
System.out.println(pwd2);
}