javascript
SpringMVC入门简单静态资源处理
Spring入門簡單靜態資源處理
- Springmvc簡介及項目搭建
- 1. 什么是springMVC?
- SpringMVC處理請求的流程
- 3. SpringMVC核心開發步驟
- 4. SpringMVC的組件
- 5. 如何在項目中添加springmvc
- Springmvc之helloword實現
- 簡單CRUD及返回值處理
- springmvc對靜態資源的處理
Springmvc簡介及項目搭建
1. 什么是springMVC?
Spring Web MVC是一種基于Java的實現了MVC設計模式的、請求驅動類型的、輕量級Web框架。
SpringMVC處理請求的流程
首先用戶發送請求–>DispatherServlet(拿到請求url并且處理獲得請求/xx)
DispatcherServlet–>HandlerMapping(處理器映射器)找到被@requestMapping注解所標記的類或者方法
DispatcherServlet–>HandlerAdapter(處理器適配器)動態的實例化類,動態調用被標記的方法實現業務
HandlerAdapter–>處理器功能處理方法的調用
ModelAndView的邏輯視圖名–>ViewRecolver
View–>渲染
返回控制權給DispatcherServlet,由DispatcherServlet返回呼應給用戶,流程結束
3. SpringMVC核心開發步驟
1 DispatcherServlet在web.xml中的部署描述,從而攔截請求到springMVC
2 HandlerMapping的配置,從而將請求映射到處理器
3 HandlerAdapter的配置,從而支持多種類型的處理器
4 處理器(頁面控制器)的配置,從而刊行功能處理
5 ViewResolver的配置,從而將邏輯視圖名解析為具體的視圖技術
4. SpringMVC的組件
1 前端控制器(DispatcherServlet)
2 請求到處理器映射(HandlerMapping)
3 處理器適配器(HandlerAdapter)
4 視圖解析器(ViewResolver)
5 處理器或頁面控制器(Controller)
6 驗證器(Validator)
7 命令對象(Command 請求參數綁定到的對象就叫命令對象)
8 表單對象(Form Object提供給表單展示和提交到的對象就叫表單對象)
5. 如何在項目中添加springmvc
1 添加相關依賴
因為等會要演示分頁需要導入jstl
2 在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml)
springmvc-servlet.xml
3 修改web.xml
<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_3_1.xsd"version="3.1"><display-name>Archetype Created Web Application</display-name><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 讀取Spring上下文的監聽器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- Spring和web項目集成end --><!-- 防止Spring內存溢出監聽器 --><listener><listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class></listener><!-- 中文亂碼處理 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!--web.xml 3.0的新特性,是否支持異步--><async-supported>true</async-supported><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><!-- Spring MVC servlet --><servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--此參數可以不配置,默認值為:/WEB-INF/springmvc-servlet.xml--><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/springmvc-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup><!--web.xml 3.0的新特性,是否支持異步--><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>SpringMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>Springmvc之helloword實現
1 @Controller:用于標識處理器類 相當與替換了struts中的<action type=“xxx” 標簽
2 @RequestMapping:請求到處理器功能方法的映射規則,可定義到類和方法
常用參數:value、method
可將@RequestMapping標簽定義到類名處窄化路徑
3 @RequestParam:請求參數到處理器功能處理方法的方法參數上的綁定
常用參數:value、required、defaultValue
注:required設置成false的參數類型必須是引用類型,因為基本數據類型是不能為null的
4 @ModelAttribute:請求參數到命令對象的綁定
常用參數:value
4.1 可用@ModelAttribute標注方法參數,方法參數會被添加到Model對象中(作用:向視圖層傳數據)
4.2 可用@ModelAttribute標注一個非請求處理方法,此方法會在每次調用請求處理方法前被調用(作用:數據初始化)
4.3 可用@ModelAttribute標注方法,方法返回值會被添加到Model對象中(作用:向視圖層傳數據)
但此方法視圖的邏輯圖就會根據請求路徑解析,例如:a/test42 --> /WEB-INF/a/test42.jsp
太麻煩幾乎不用,不用直接保存到Model或ModelAndView中
5@SessionAttributes:指定ModelMap中的哪些屬性需要轉存到session
常用參數:value、types
注1:必須放到class類名處
6 @InitBinder(本章暫不介紹):用于將請求參數轉換到命令對象屬性的對應類型
7@RequestBody(重要):用于目前比較流行的ajax開發的數據綁定(即提交數據的類型為json格式)
@ResponseBody 等于
ObjectMapper om =new ObjectMapper();
String xxx = om.writeValueAsString(“xxx”);
二行代碼
只要有這個@ResponseBody不管你方法的返回值是
String類型還是集合它都能給你返回json數據
第一個springMVC程序:HelloWorld
創建controller包添加HelloContrller
HelloController
訪問hello1直接返回json串
進入到hello.jsp
集合也是返回json
頁面跳轉五種情況
1、轉發到頁面
2、轉發到根路徑下的頁面
3、轉發到requestMapper中
4、重定向Dao根路徑下的頁面
5、重定向到requestMapper下
轉發:“forward:path”
重定向:“redirect:path”
注1:這兩種跳轉方式將會繞開視圖解析器的前綴和后綴
注2:還有就是如果是在同一controller中則不用使用"/"從根目錄開始,而如果是在不同的controller則一定要從根目錄開始。
HelloController
package com.liuchunming.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap; import java.util.Map;/*** @author liuchunming* @site www.liuchunming.com* @company xxx公司* @create 2020-10-23 11:17*/ //將這個類交給spring所管理 @Controller public class HelloController {/*** @ResponseBody 等于* ObjectMapper om =new ObjectMapper();* String xxx = om.writeValueAsString("xxx");* 三行代碼* 只要有這個@ResponseBody不管你方法的返回值是* String類型還是集合它都能給你返回json數據** 五種情況* 1、轉發到頁面* 2、轉發到根路徑下的頁面* 3、轉發到requestMapper中* 4、重定向Dao根路徑下的頁面* 5、重定向到requestmapper下* @return@ResponseBody@RequestMapping("/hello1")public String hello1() {System.out.println("hello1 springmvc");return "hello1 springmvc";}@RequestMapping("/hello2")public String hello2(){System.out.println("hello2 springmvc");return "hello";}@ResponseBody@RequestMapping("/hello3")public Map hello3(){System.out.println("hello3 springmvc");Map map=new HashMap();map.put("total",12);map.put("rows","一串的數據");return map;}*//*五種情況* 1、轉發到頁面* 2、轉發到根路徑下的頁面* 3、轉發到requestMapper中* 4、重定向Dao根路徑下的頁面* 5、重定向到requestMapper下* */@RequestMapping("/forward1")public String forward1(){System.out.println("進來forward");return "aa";}@RequestMapping("/forward2")public String forward2(){return "forward:/bb.jsp";}@RequestMapping("/forward3")public String forward3(){return "forward:/forward1";}@RequestMapping("/redirect1")public String redirect1(){return "redirect:/bb.jsp";}@RequestMapping("/redirect2")public String redirect2(){return "redirect:/forward1";}}簡單CRUD及返回值處理
@PathVariable:用于將請求 URL 中的模板變量映射到功能處理方法的參數上,即取出 uri 模板中的變量作為參數。
之前是實現Modedriver來進行傳值的,現在不用了,只需要在方法里面加一個實體就ok了,前臺傳值只需要注意與實體的屬性對應就沒問題。
其實現原理是利用環繞通知中獲取所有參數的那種方法+反射賦值實現的。
分頁標簽
PageTag
pageBean
package com.liuchunming.util;import javax.servlet.http.HttpServletRequest; import java.io.Serializable; import java.util.Map;public class PageBean implements Serializable {private static final long serialVersionUID = 2422581023658455731L;//頁碼private int page=1;//每頁顯示記錄數private int rows=10;//總記錄數private int total=0;//是否分頁private boolean isPagination=true;//上一次的請求路徑private String url;//獲取所有的請求參數private Map<String,String[]> map;public PageBean() {super();}//設置請求參數public void setRequest(HttpServletRequest req) {String page=req.getParameter("page");String rows=req.getParameter("rows");String pagination=req.getParameter("pagination");this.setPage(page);this.setRows(rows);this.setPagination(pagination);this.url=req.getContextPath()+req.getServletPath();this.map=req.getParameterMap();}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public Map<String, String[]> getMap() {return map;}public void setMap(Map<String, String[]> map) {this.map = map;}public int getPage() {return page;}public void setPage(int page) {this.page = page;}public void setPage(String page) {if(null!=page&&!"".equals(page.trim()))this.page = Integer.parseInt(page);}public int getRows() {return rows;}public void setRows(int rows) {this.rows = rows;}public void setRows(String rows) {if(null!=rows&&!"".equals(rows.trim()))this.rows = Integer.parseInt(rows);}public int getTotal() {return total;}public void setTotal(int total) {this.total = total;}public void setTotal(String total) {this.total = Integer.parseInt(total);}public boolean isPagination() {return isPagination;}public void setPagination(boolean isPagination) {this.isPagination = isPagination;}public void setPagination(String isPagination) {if(null!=isPagination&&!"".equals(isPagination.trim()))this.isPagination = Boolean.parseBoolean(isPagination);}/*** 獲取分頁起始標記位置* @return*/public int getStartIndex() {//(當前頁碼-1)*顯示記錄數return (this.getPage()-1)*this.rows;}/*** 末頁* @return*/public int getMaxPage() {int totalpage=this.total/this.rows;if(this.total%this.rows!=0)totalpage++;return totalpage;}/*** 下一頁* @return*/public int getNextPage() {int nextPage=this.page+1;if(this.page>=this.getMaxPage())nextPage=this.getMaxPage();return nextPage;}/*** 上一頁* @return*/public int getPreivousPage() {int previousPage=this.page-1;if(previousPage<1)previousPage=1;return previousPage;}@Overridepublic String toString() {return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination+ "]";} }l.tld
<?xml version="1.0" encoding="UTF-8"?><taglib xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"version="2.0"><description>JSTL 1.1 core library</description><display-name>JSTL core</display-name><tlib-version>1.1</tlib-version><short-name>l</short-name><uri>/liuchunming</uri><tag><name>page</name><tag-class>com.liuchunming.tag.PageTag</tag-class><body-content>JSP</body-content><attribute><name>pageBean</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag> </taglib>BookController
package com.liuchunming.controller;import com.liuchunming.model.Book; import com.liuchunming.service.BookService; import com.liuchunming.util.PageBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest; import java.util.List;/*** @author liuchunming* @site www.liuchunming.com* @company xxx公司* @create 2020-10-24 9:03* @RequestMapping("/book") :定義命名空間,防止請求重復*/ @Controller @RequestMapping("/book") public class BookController {@Autowiredprivate BookService bookService;@RequestMapping("/list")public String list(Book book, HttpServletRequest req){PageBean pageBean =new PageBean();pageBean.setRequest(req);List<Book> bb = this.bookService.listPager(book, pageBean);req.setAttribute("bookList",bb);req.setAttribute("pageBean",pageBean);return "bookList";}@RequestMapping("/proSave")public String proSave(Book book, HttpServletRequest req){if(book !=null && book.getBid() !=null && book.getBid()!=0){Book b = this.bookService.selectByPrimaryKey(book.getBid());req.setAttribute("book2",b);}return "bookEdit";}@RequestMapping("/add")public String add(Book book,HttpServletRequest req){this.bookService.insert(book);//redirect:/book/list 跳到命名空間中的list方法return "redirect:/book/list";}@RequestMapping("/edit")public String edit(Book book, HttpServletRequest req){this.bookService.updateByPrimaryKeySelective(book);return "redirect:/book/list";}@RequestMapping("/del/{bid}")public String del(@PathVariable("bid") Integer bid, HttpServletRequest req){this.bookService.deleteByPrimaryKey(bid);return "redirect:/book/list";} }效果
模糊查詢
springmvc對靜態資源的處理
正常來說我訪問項目下這張圖片是訪問不到的會報錯404,springmvc框架會將靜態資源文件訪問,當作一個request請求來處理,最終會找不到對應的資源文件
在springmvc-servlet.xml中配置映射js/css映射路徑
訪問效果
總結
以上是生活随笔為你收集整理的SpringMVC入门简单静态资源处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU2594 Simpsons’ Hi
- 下一篇: pdfjs 字体新增_JSPDF支持中文