Spring MVC
1.結構最清晰的MVC Model2實現
2.Controller
3.ModelAndView
1.HTTP請求 SpringMVC核心是前端控制器DispatcherServlet 在web.xml <servlet-name>-servlet.xml配置 html
2.HandlerMapping:經過配置去找Handler(Controller)前端
3.Handler:處理器 調用service方法進行業務處理git
4.返回數據ModelAndView(增刪改查)邏輯視圖名 並非真正的視圖對象web
5.ViewResolver :視圖解析器 DispatcherServlet藉助視圖解析器把邏輯視圖名解析成真正的視圖對象。正則表達式
6.得到model數據模型放到View視圖中(JSP/JSTL/PDF...)spring
7.HTTP響應給客戶端(用戶)mvc
springMVC在web.xml配置
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup><!--優先啓動 -->
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
springMVC-servlet.xml核心配置文件/WEB-INF/springMVC-servlet.xml
<!-- 經過bean的name,完成url映射 -->
<bean name="/springMVC.html" class="cn.bdqn.controller.HelloController"/>
name是用戶請求的url 經過class找到controller controller返回modelandwiew 經過視圖解析器解析返回view視圖給用戶。
<!-- 視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
我要放到resource裏面 在web.xml 配置
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!--優先啓動 -->
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
註解的方式:DefaultAnnotationHandlerMapping
<!--使用annotation方式,完成映射-->
<!--使用annotation方式,完成映射-->
<!--讓spring掃描包下的全部的類,讓標註spring註解的類生效 -->
<context:component-scan base-package="cn.bdqn.controller"></context:component-scan>
<mvc:annotation-driven/>
經過@RequestMapping(value = "/hello")
經過@RequestMapping的value匹配用戶請求的url找到controller類的xxx方法 再執行
@Controller
public class WelcomController {
// 經過@RequestMapping的value匹配用戶請求的url找到controller類的hello()方法 再執行
@RequestMapping(value = "/hello")
public String hello() {
System.out.println("hello spring!!!");
return "hello";// 邏輯視圖名
}
}
視圖解析器:
1.將邏輯視圖的名字與JSP等視圖技術進行匹配
2.InternalResourceViewResolver
在web應用程序的War文件中查找視圖模板,視圖模板的路徑根據加完前綴和後綴的邏輯視圖名稱來肯定
prefix
suffix
<!-- 視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
參數的傳遞-1
1.@RequestParam
2.直接經過函數參數傳值
@RequestMapping(value = "/hello")
public String hello(@RequestParam(value = "username") String username) {
System.out.println("hello spring!!! username----->>>" + username);
return "hello01";// 邏輯視圖名
}
@RequestParam(value = "username")請求中的參數必須寫
@RequestMapping(value = "/hello")
public String hello(String name) {
System.out.println("hello spring!!! name----->>>" + name);
return "hello01";// 邏輯視圖名
}
經過url傳來的參數 在後臺直接能取到。可是參數名必須與方法傳遞的參數名一致 不然獲取不到
@RequestMapping(value = "/hello")
// 經過model.addAttribute("username",name)放進做用域。經過EL表達式取出數據
public String hello(String name, Model model) {
model.addAttribute("username", name);
System.out.println("hello spring!!! name----->>>" + name);
return "hello01";// 邏輯視圖名
}
@RequestMapping(value = "/hello")
// 經過model.addAttribute("username",name)放進做用域。經過EL表達式取出數據
public ModelAndView hello(String name) {
System.out.println(name);
ModelAndView model = new ModelAndView();
model.setViewName("hello01");// 邏輯 視圖名
model.addObject("username", name);
return model;
}
@RequestMapping(value = "/hello")
// 經過model.addAttribute("username",name)放進做用域。經過EL表達式取出數據
public ModelAndView hello(String name) {
System.out.println(name);
ModelAndView model = new ModelAndView();
model.setViewName("hello01");// 邏輯 視圖名
model.addObject(name);// 在前臺取值${string} 就是取到value的數據類型
return model;
}
@RequestMapping(value = "/hello")
// 經過model.addAttribute("username",name)放進做用域。經過EL表達式取出數據
public String hello(String name, Map<String, Object> model) {
System.out.println(name);
model.put("name", name);// 在前臺取值${string} 就是取到value的數據類型
return "hello01";
}
參數的傳遞-2
經過Map<Spring,Object>
Model
controller是單例的。
REST風格 並非rest技術
1.Representational State Transfer表達性狀態轉移
2.傳統的查、改、刪的URL與REST風格的增刪改URL對比
/userview.action?id=12 VS /user/12
/userdelete.action?id=12 vs /user/12/delete
/userdelete.action?id=12 vs /user/12/update
3.請求方式
GET 讀取數據 查詢
POST 添加 提交
DELETE 刪除
PUT 修改
他強調的是一個資源能夠對應多種視圖
建立POJO-User類
HashMap
@RequestMapping(value="/userlist",method=RequestMethod.GET)
@Controller
@RequestMapping(value = "/user")
public class UserController {app
private static Map<String, Object> map = new HashMap<String, Object>();jsp
// 經過靜態代碼塊賦值
static {
map.put("1", new User(1, "張三", "123456", "bdan@123.com"));
map.put("2", new User(2, "李四", "123456", "bdan@456.com"));
map.put("3", new User(3, "王五", "123456", "bdan@789.com"));
}函數
@RequestMapping(value = "/list",method = RequestMethod.GET)
public String list(Model model) {
model.addAttribute("map", map);
return "user/userlist";
}
}
用戶列表:<br>
<c:forEach var="ul" items="${map }">
id:${ul.value.id }------
userName:${ul.value.userName }------
password:${ul.value.password }------
email:${ul.value.email }<br>
</c:forEach>
@RequestMapping(value = "/list",method = RequestMethod.GET)
public String userList(HttpServletRequest request) {
List<User> list = new ArrayList<User>();
list.add(new User(1, "張三", "123456", "bdan@123.com"));
list.add(new User(2, "李四", "123456", "bdan@456.com"));
list.add(new User(3, "王五", "123456", "bdan@789.com"));
request.setAttribute("list", list);
return "user/userlist";
}
用戶列表:<br>
<c:forEach var="user" items="${list }">
id:${user.id }------
userName:${user.userName }------
password:${user.password }------
email:${user.email }<br>
</c:forEach>
model的做用域是個request級別
異常處理
JSR303 是一套JavaBean參數校驗的標準,它定義了不少經常使用的校驗註解,咱們能夠直接將這些註解加在咱們JavaBean的屬性上面,就能夠在須要校驗的時候進行校驗了。註解以下:
@NotNull 註解元素必須是非空
@Null 註解元素必須是空
@Digits 驗證數字構成是否合法
@Future 驗證是否在當前系統時間以後
@Past 驗證是否在當前系統時間以前
@Max 驗證值是否小於等於最大指定整數值
@Min 驗證值是否大於等於最小指定整數值
@Pattern 驗證字符串是否匹配指定的正則表達式
@Size 驗證元素大小是否在指定範圍內
@DecimalMax 驗證值是否小於等於最大指定小數值
@DecimalMin 驗證值是否大於等於最小指定小數值
@AssertTrue 被註釋的元素必須爲true
@AssertFalse 被註釋的元素必須爲false
Hibernate validator 在JSR303的基礎上對校驗註解進行了擴展,擴展註解以下:
@Email 被註釋的元素必須是電子郵箱地址
@Length 被註釋的字符串的大小必須在指定的範圍內
@NotEmpty 被註釋的字符串的必須非空
@Range 被註釋的元素必須在合適的範圍內
<!-- 處理字符編碼filter -->
<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>
@RequestMapping(value = "/addSave", method = RequestMethod.POST)
public String addSave(@Validated User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "user/add";// 若是用戶輸入不正確 就會返回add 從新輸入
}
map.put(user.getId() + "", user);
return "redirect:/user/list";
}
/**
* REST風格
* @param id
* @param model
* @return
*/
@RequestMapping(value = "/view/{id}", method = RequestMethod.GET)
public String view(@PathVariable String id, Model model) {
System.out.println(id);
model.addAttribute("user", map.get(id));
return "user/view";
}
/**
* 先回顯 在修改
* @param id
* @param user
* @return
*/
@RequestMapping(value = "/{id}/update", method = RequestMethod.GET)
public String update(@PathVariable String id, Model model) {
model.addAttribute(map.get(id));
return "user/update";
}
/**
* 修改@PathVariable REST風格獲取參數 {id}入參的形式
* @param id
* @param user
* @param bindingResult
* @return
*/
@RequestMapping(value = "/{id}/update", method = RequestMethod.POST)
public String update(@PathVariable String id, @Validated User user,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "user/update";
}
map.put(user.getId() + "", user);
return "redirect:/user/list";
}
@RequestMapping(value = "/{id}/delete", method = RequestMethod.GET) public String detele(@PathVariable String id) { map.remove(id);// 刪除 return "redirect:/user/list"; } 1.異常處理 1.局部異常處理:@ExceptionHandler 2.全局異常處理:SimpleMappingExceptionResolver 2.使用Servlet API對象做爲入參 1.HttpSession 2.HttpServletRequest 3.HttpServletResponse map<key,value> hash表的結構 1 map<object,object> map key="t01" value的內存地址