SpringMVC工作原理;類型轉換器;controller接收請求的方法@PathVariable\@RequestParam 註解字符串解析成類屬性自動賦值

先搞清楚Spring和SpringMVC區別:
Spring是IOC和AOP的容器框架,即Spring是管理Bean的;而SpringMVC是基於Spring功能之上添加的Web框架。即SpringMVC依賴於Spring,
複習Spring Spring MVC 最近自己在用spring boot ;但這種基本的還是要理解。

2.自定義類型轉換器

  • converter<tar,obj> 接口
    tar表示源類型;obj目標類型

  • Formatter數據源必須是String,在Web應用更加合理。

3.字符串自動賦值給類屬:

當輸入“apple,10.58,200”時,表示在程序中自動創建一個new Goods,並將“apple”值自動賦值給goodsname屬性,將“10.58”值自動賦值給goodsprice屬性,將“200”值自動賦值給goodsnumber屬性。

1.實體類 GoodsModel

package  dto/model;
public class GoodsModel {
	private String goodsname;
	private double goodsprice;
	private int goodsnumber;
	//省略setter和getter方法
}

2.控制器類
使用@RequestParam(“goods”)接收請求參數,
然後調用自定義類型轉換器GoodsConverter將字符串值轉換爲GoodsModel的對象gm
使用@RequestMapping("/converter")或者@RequestMapping("/formatter")

@Controller
@RequestMapping("/my")
public class ConverterController {
	/*
	@RequestMapping("/converter")
	@RequestMapping("/formatter")
*/
	@RequestMapping("/converter")
	public String myConverter(@RequestParam("goods") GoodsModel gm, Model model){
		model.addAttribute("goods",gm);
		return "showGoods";
	}
}

3.package: converter
GoodConverter.java 實現Converter<S,T>接口並且實現該方法

public class GoodsConverter implements Converter<String, GoodsModel>{

}

4.springmvc-servlet.xml
在配置文件中註冊自定義類型轉換器

 <!-- 註冊類型轉換器GoodsConverter -->  
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
  		<property name="converters">
  			<list>
  				<bean class="converter.GoodsConverter"/>
  			</list>
  		</property>
  </bean>

5.mvc模式 & Spring MVC工作原理

mvc模式

mvc模式

spring mvc 工作原理

四個星星:MVC四個接口:

  • 所有請求都經過DispatcherServlet統一分發給各Controller;
  • 請求到Controller的映射:藉助Spring MVC提供的HandlerMapping定位到具體的Controller;
  • Controller處理用戶請求,返回ModelAndView對象給DispatcherServlet(前端控制器),ModelAndView:返回包含模型(Model)和視圖(View);
  • ViewResolver:查找View對象,渲染頁面。
    spring mvc工作原理

流程:
1.客戶端發出http請求(localhost:8880)到DispatcherServlet前端控制器

2.DispatcherServlet 通過 handlerMapping找對應的Controller

3.調用Controller

4.Controller通過Service處理用戶的請求

5.返回ModelAndView(return回的)處理結果給DispatcherServlet

6.處理視圖映射ViewResolver找到View對象要渲染頁面

7.通過Model將模型數據傳給視圖View顯示

​8.返回請求

web.xml 部署DispatcherServlet:
其servlet對象springmvc初始化時,將在應用程序的WEB-INF目錄下查找一個配置文件
即WEB-INF下創建的springmvc-servlet.xml(springName-servlet.xml

<!--部署DispatcherServlet-->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 表示容器在啓動時立即加載servlet -->
    <load-on-startup>1</load-on-startup>
</servlet> 
<servlet-mapping>
	<servlet-name>springmvc</servlet-name>
	<!-- 處理所有URL-->
    <url-pattern>/</url-pattern>
</servlet-mapping>

springmvc-servlet.xml
在基於註解之後不需要bean控制器類

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    	   http://www.springframework.org/schema/beans 
    	   http://www.springframework.org/schema/beans/spring-beans.xsd">                 
  <!--LoginController控制器類,映射到“/login”  -->  
  <bean name="/login" class="controller.LoginController"/>
  <!--RegisterController控制器類,映射到“/register”  --> 
  <bean name="/register" class="controller.RegisterController"/>
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
       <!-- 前綴 -->
       <property name="prefix" value="/WEB-INF/jsp/" />
       <!-- 後綴 -->
       <property name="suffix" value=".jsp" />
  </bean>
  	
</beans>

4.Controller接受請求的方法

springmvc-servlet.xml
@RequestMapping(" [ 請求的地址 ] ", method=“POST/GET”)在方法或者類上(默認post)
或者直接@PostMapping@GetMapping
自動掃描代替用bean來註冊:

<!-- 使用掃描機制,掃描控制器類,控制器類都在controller包及其子包下 -->
   <context:component-scan base-package="controller"/>

1.通過@PathVariable接收URL中的請求參數

僅Get提交方式 @GetMapping或加method屬性的@RequestMapping

@RequestMapping(value="/register/{uname}/{upass}", method=RequestMethod.GET)
	//必須加method屬性的
public String register(@PathVariable String uname,@PathVariable String upass, Model model) {
}
@GetMapping("/profile/{action}")
public String profile(@PathVariable(name = "action")String action,
                      Model model){
    if("productions".equals(action)){}
}

2.通過@RequestParam接收請求參數

升級版”處理方法“
獲取時候與前端的name都需要一致:
“通過處理方法的形參接收請求參數”不會報404錯誤,而“通過@RequestParam接收請求參數”會404錯誤

3.通過@ModelAttribute接收請求參數

升級版”@RequestParam“
不需要使用model.addAttribute語句,自動數據綁定與模型數據展示
@ModelAttribute(“user”) UserForm user
將請求參數的輸入封裝到user對象中 並且 創建UserForm實例,以“user”爲鍵值存儲在Model對象中,與“model.addAttribute(“user”, user)”語句功能一樣.

@ModelAttribute UserForm user (沒有制定鍵值)
默認model.addAttribute(“userForm”, user)

4.通過HttpServletRequest接收請求參數

@RequestMapping("/register")
public String register(HttpServletRequest request, Model model) {
	String uname = request.getParameter("uname");
	String upass = request.getParameter("upass");

5.通過處理方法的形參接收請求參數

6.通過實體bean接收請求參數

return:默認轉發

/轉發到一個視圖
return " str ";
/重定向到一個請求方法
return "redirect:/str";
/(同一個控制器類裏,可省略/str1/return "forward:/str1/str2";
發佈了47 篇原創文章 · 獲贊 18 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章