7 Steps to Create New Oracle Database from Command Line
阿新 • • 發佈:2021-07-14
1.SpringMVC快速入門
- MVC是一種軟體架構模式,分離了啞無邏輯和顯示介面,包括model 模型、view檢視、controller控制器,其中model負責處理業務邏輯,封裝試題,view檢視展現內容,controller控制器負責排程分發,如接受請求,呼叫模型,發出響應
- SpingMVC是一種基於java的實現MVC 設計模式的輕量級web框架,屬於SpringFrameWork的後續產品,融合在Spring Web Flow中,通過一套註解讓一個簡單的java成為處理請求的控控制器,無須實現任何藉口,同時還支援RESTful程式設計風格的請求
- 封裝了原來的servlet中的共有行為,實現了引數封裝,檢視轉發等功能
- 快速入門
- 建立web專案,匯入SpringMVC相關座標
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion
- 配置SpringMVC前端控制器 DispathcerServlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring_mvc.xml</param-value> </init-param> <!-- 啟動時載入--> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
- 編寫Controller類和檢視頁面,使用註解配置Controller類中業務方法的對映地址
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>成功響應</title> </head> <body> <%--檢視頁面--%> <h2>成功響應springmvc</h2> </body> </html>
package com.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { // 編寫Controller類,跳轉到/quick地址並響應 @RequestMapping("/quick") public String quick(){ System.out.println("收到請求了"); return "success.jsp"; } }
- 配置SpringMVC核心檔案 spring-mvc.xml
<!-- 開啟註解掃描-->
<context:component-scan base-package="controller"/> - 執行流程:Tomcat接受客戶端發出的請求,解析請求資源地址,建立代表請求物件和響應物件,呼叫目標資源,此時通過前置DispatchServlet進行地址解析,將請求傳送給對應的/quick的controller,執行響應,將響應傳給前置DispatchServlet解析,組裝成對應的響應傳送給客戶端
2.springmvc執行流程
- 執行元件(springMVC三大元件是處理器對映器,處理器介面卡,和檢視解析器;四大元件是前端控制器,檢視解析器,處理器介面卡和處理器對映器)
- 前端控制器DispatcherServlet:使用者請求到達前端控制器,由它呼叫其他元件處理使用者的請求,降低了元件之間的耦合性
- 處理器對映器HandlerMapping:通過對映器對處理器進行適配,對更多型別的處理器進行執行,採用了介面卡模式
- 處理器Handler:由開發者編寫,是真正執行請求的控制器,對具體業務進行處理
- 檢視解析器ViewResolver:負責將處理結果生成view檢視,它首先將邏輯檢視名解析層物理檢視名,找到對應的頁面地址,再生成view檢視物件,對view進行渲染並將結果通過頁面展示給使用者
- 檢視view:有開發者編寫,springMVC支援很多的view檢視型別,如jstlView、freemarkerView、pdfView等,最常用的是jsp,通過頁面標籤或頁面模板技術將頁面展示給使用者
- 自定義配置三大元件
- 處理器介面卡和處理器對映器
<!-- 配置處理器介面卡和處理器對映器 ,可以對json格式解析,進行了方法的增強--> <mvc:annotation-driven/>
- 檢視解析器,一遍用於邏輯檢視到物理檢視地址的拼接
- 執行流程
- 使用者傳送請求到前端控制器DispatcherServlet,前端控制器收到請求後呼叫處理器對映器HandlerMapping
- 處理器對映器根據請求,通過xml配置或註解方式找到對應的處理器,生成處理器物件和處理器攔截器,並返回給前端控制器
- 前端控制器呼叫處理器介面卡HandlerAdapter,由介面卡通過適配方式找到具體的控制器即處理器(後端控制器)
- 處理器執行完返回ModelAndView,處理器介面卡將後端控制器的執行結果ModelAndView返還給前端控制器
- 前端控制器將ModelAndView傳給ViewReslover檢視解析器,由檢視解析器後返還具體的view
- 前端控制器根據view進行檢視渲染,並響應客戶
- 常用註解
- Controller:SpringMVC基於Spring容器,所以在進行SpringMVC操作時,需要將Controller儲存到Spring容器中,如果使用@Controller註解標註的話,就需要使用
<!--配置註解掃描--> <context:component-scan base-package="com.controller"/>
- RequestMapping:用於建立請求url和處理請求方法之間的對應關係
- 類上:URL的一級訪問目錄,以/開頭,方便模組化管理
- 方法上:URL的二級訪問目錄,和一級目錄組成一個完整的 URL 路徑
- value:用於指定請求的URL。它和path屬性的作用是一樣的
- method:用來限定請求的方式
- params:用來限定請求引數的條件,如{"accountName"} 表示請求引數中必須有accountName;{"money!100"} 表示請求引數中money不能是100
- 訪問頁面或跳轉時,WEB-INF下預設是安全資源,在其包下的資源不可以通過url直接獲取,只可以在伺服器內轉發
- Controller:SpringMVC基於Spring容器,所以在進行SpringMVC操作時,需要將Controller儲存到Spring容器中,如果使用@Controller註解標註的話,就需要使用
3. SpringMVC請求
- springMVC可以接收的引數型別:基本引數型別、物件引數型別、陣列引數型別、集合引數型別。
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2021/7/17 Time: 14:51 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>請求資料</title> </head> <body> <%--不要有空格--%> <a href="${pageContext.request.contextPath}/data?username=大明&age=19" >普通資料型別</a> <a href="${pageContext.request.contextPath}/object?name=大明&id=2" >物件型別</a> <form method="post" action="${pageContext.request.contextPath}/array"> <input type="checkbox" name="ids" value="1">1<br> <input type="checkbox" name="ids" value="2">2<br> <input type="checkbox" name="ids" value="3">3<br> <input type="checkbox" name="ids" value="4">4<br> <input type="checkbox" name="ids" value="5">5<br> <input type="submit" value="陣列元素"> </form> <form method="post" action="${pageContext.request.contextPath}/listormap"> 關鍵詞 <input type="text" name="keyword"> 使用者id<input type="text" name="user.id">姓名<input type="text" name="user.name"> 第一個集合<input type="text" name="userList[0].id"><input type="text" name="userList[0].name"> 第二個集合<input type="text" name="userList[1].id"><input type="text" name="userList[1].name"> 第一個map<input type="text" name="map['u1'].id"><input type="text" name="map['u1'].name"> 第二個map<input type="text" name="map['u2'].id"><input type="text" name="map['u2'].name"> <input type="submit" value="集合資料型別"> </form> <form method="post" action="${pageContext.request.contextPath}/date"> 自定義轉換器 生日<input type="text" name="date"> <input type="submit" value="自定義轉換器 生日"> </form> <a href="${pageContext.request.contextPath}/page?pageNo = 2" >物件型別</a> </body> </html>
package domain; import java.util.List; import java.util.Map; public class QueryVo { private String keyword; private User user; private List<User> userList; private Map<String,User> map; @Override public String toString() { return "QueryVo{" + "keyword='" + keyword + '\'' + ", user=" + user + ", userList=" + userList + ", map=" + map + '}'; } public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } public Map<String, User> getMap() { return map; } public void setMap(Map<String, User> map) { this.map = map; } } package domain; public class User { private int id; private String name; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } }
package domain;
public class User {
private int id;
private String name;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}package controller; import domain.QueryVo; import domain.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.Arrays; import java.util.Date; @Controller public class UserController { @RequestMapping("/data") public String data(String username,Integer age){ System.out.println(username); System.out.println(age); return "success"; } @RequestMapping("/object") public String object(User user){ System.out.println(user); return "success"; } @RequestMapping(path = "/array") public String array(Integer[] ids){ System.out.println(Arrays.toString(ids)); return "success"; } @RequestMapping("/listormap") public String listormap(QueryVo queryVo){ System.out.println(queryVo); return "success"; } }
- controller中的業務方法會對引數值進行自動對映匹配和型別轉換,將引數由string型別轉為對應的要求型別
- 中文亂碼過濾器:當post請求時資料會出現亂碼,需要通過中文過濾器進行編碼過濾
<!-- 中文過濾器--> <filter> <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 自定義轉換器:springMVC提供了一些常用的型別轉換器,對於特有的行為讓那個開發者自定義處理
package converters; import org.springframework.core.convert.converter.Converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ConverterDate implements Converter<String,Date> { @Override public Date convert(String birth) { SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd"); Date date =null; try { date = sdf.parse(birth); } catch (ParseException e) { e.printStackTrace(); } return date; } }
<!-- 配置處理器介面卡和處理器對映器 ,可以對json格式解析,進行了方法的增強--> <mvc:annotation-driven conversion-service="conversionService"/> <!-- 配置自定義轉換器--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="converters.ConverterDate"/> </set> </property> </bean>
package controller; import domain.QueryVo; import domain.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.Arrays; import java.util.Date; @Controller public class UserController { @RequestMapping("/date") public String date(Date date){ System.out.println(date); return "success"; } }
- 請求常用註解
- @RequestParam:當請求引數名與controller業務方法的引數名不一致時,可以顯示繫結,設定預設值和資料非必須
- @RequestHeader:獲取請求頭資料
- @CookieValue:獲取cookie中的資料
- 獲取相關的Servlet相關API:SpringMVC支援使用原始ServletAPI物件作為控制器方法的引數進行注入,如request,response和session
package controller; import domain.QueryVo; import domain.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.Arrays; import java.util.Date; @Controller public class UserController { @RequestMapping("/page") // required 設定是否必須傳遞引數,預設值為true;如果設定了預設值,值自動改為false public String page(@RequestParam(name="pageNo", defaultValue ="1", required = false) Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize){ System.out.println(pageNum); System.out.println(pageSize); return "success"; } @RequestMapping("/header") public String header(@RequestHeader("cookie") String cookie){ System.out.println(cookie); return "success"; } @RequestMapping("/cookie") public String cookie(@CookieValue("JSESSIONID") String cookie){ System.out.println(cookie); return "success"; } @RequestMapping("/springAPI") public String springAPI(HttpServletRequest request, HttpServletResponse response, HttpSession session){ System.out.println(request); System.out.println(response); System.out.println(session); return "success"; } }
4. springMVC響應
- 頁面跳轉方式包括返回字串邏輯檢視、void原始ServletAPI和ModelAndView方式
- void原始ServletAPI格式
// 原始Servlet @RequestMapping("/servlet") public void servlet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;utf-8"); response.getWriter().println("我收到額"); request.setAttribute("username", "原始servlet"); // request.getRequestDispatcher("success.jsp").forward(request, response); }
- 返回的資料格式可以通過直接返回字串資料方式或將物件、集合轉為json格式返回
- 使用字串邏輯檢視實現頁面的跳轉實際上是執行請求轉發,相當於forward
- forward關鍵字實現轉發,則路徑必須是實際檢視URL,相當於 request.getRequestDispatcher("url").forward(request,response) ,既可以轉發到jsp,也可以轉發到其他的控制器方法
@RequestMapping("/forward") public String forward(Model model) { model.addAttribute("username", "轉發"); return "forward:success.jsp"; }
- Redirect重定向實現重定向,路徑必須是實際檢視URL,虛擬目錄springMVC框架自動完成拼接
@RequestMapping("/redirect") public String redirect(Model model) { model.addAttribute("username", "重定向"); // 重定向的頁面不會展示username的值 return "redirect:success"; }
- ModelAndView有兩種方式實現,推薦方式二
- 在Controller中方法建立並返回ModelAndView物件,並且設定檢視名稱
- 在Controller中方法形參上直接宣告ModelAndView,無需在方法中自己建立,在方法中直接使用該物件設定檢視,同樣可以跳轉頁面
//ModelAndView方式一 @RequestMapping("/model1") public ModelAndView model1() { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("username", "modelAndView方式一"); modelAndView.setViewName("success"); return modelAndView; } //ModelAndView方式二 @RequestMapping("/model2") public ModelAndView model2(ModelAndView modelAndView) { modelAndView.addObject("username", "modelAndView方式二"); modelAndView.setViewName("success"); return modelAndView; }
- @SessionAttributes:適用於在多個請求之間共有資料,在控制器類上標註並配置需要在session中存放的資料,Spring MVC將存放在model中對應的資料暫存到HttpSession
@RequestMapping("/forward") public String forward(Model model) { model.addAttribute("username", "轉發"); return "forward:success.jsp"; } @RequestMapping("/returnString") public String returnString() { return "success"; }
5.靜態資源的開啟
- 問題:當有靜態資源需要載入,如query檔案,通過谷歌開發者工具抓包發現沒有載入到jquery文件
- 原因:SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是 /(預設),代表對所有的靜態資源都進行處理操作,這樣就不會執行Tomcat內建的DefaultServlet處理
- 解決:配置檔案放行靜態資源
<!--方式一:在springmvc配置檔案中指定放行資源--> <mvc:resources mapping="/js/**" location="/js/"/> <mvc:resources mapping="/css/**" location="/css/"/> <mvc:resources mapping="/img/**" location="/img/"/> <!--方式二(推薦):在springmvc配置檔案中開啟DefaultServlet處理靜態資源--> <mvc:default-servlet-handler/>