要點
- SpringMVC簡介
- 搭建環(huán)境入門程序
- 全注解
- J2EE三層使用的注解
- 使用步驟
- 對靜態(tài)資源的處理
- 傳參方式
- 原始方式request.getParameter()
- 方法形參與前臺參數(shù)同名
- 對象傳參
- 地址欄傳參
- 中文亂碼處理
- 傳值方式
- 通過request.setAttribute()
- addObject()的方式
- 直接返回對象
- 配置視圖解析器
- forward方式
- redirect方式
- 通過Model方式
- 文件上傳/下載
- 文件上傳
- 配置文件上傳解析器
- 上傳方法參數(shù)MultipartFile
- 文件下載
- 攔截器
- preHandle方法
- postHandle方法
- afterCompletion方法
- 返回JSON格式數(shù)據(jù)
- 日期處理
- 前臺往后臺傳參
- 后臺往前臺回顯值(JSON)
1.SpringMVC簡介
SpringMVC屬于SpringFrameWork的后續(xù)產品谓苟,已經融合在Spring Web Flow里面。Spring 框架提供了構建 Web 應用程序的全功能 MVC 模塊协怒。使用 Spring 可插入的 MVC 架構涝焙,從而在使用Spring進行WEB開發(fā)時,可以選擇使用Spring的SpringMVC框架或集成其他MVC開發(fā)框架孕暇,如Struts1仑撞,Struts2等,在這里暫時就不分析SpringMVC與Struts2的比較了.
2.搭建環(huán)境入門程序
需要的jar包(需要什么包添加什么包就不一下全部添加進去了 )
1)添加Spring的核心包
com.springsource.org.apache.commons.logging-1.1.1.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
添加web.xml文件,使用3.0或以上的版本,3.0以下的對el表達式不是很智能,需要配置isELIgnored="false"
配置前端控制器
<!--前端控制器/請求分發(fā)器-->
<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:application-mvc.xml</param-value>
</init-param>
<!--設置優(yōu)先級-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
創(chuàng)建自定義的Controller類,實現(xiàn)Controller接口.復寫handleRequest方法
public class HelloWorldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//創(chuàng)建自定義Controller類,實現(xiàn)contrller接口復寫handleRequest方法
request.setAttribute("msg","hello!");
request.getRequestDispatcher("/hello.jsp").forward(request,response);
return null;
}
}
配置Controller的映射路徑,并且交給spring來管理bean
<!--name請求的映射路徑 class:該路徑處理類-->
<bean name="/index" class="com.jd.controller.HelloWorldController"></bean>
讓框架去找我們自定義的文件名與路徑
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application-mvc.xml</param-value>
</init-param>
第一次訪問的時候才去加載框架
如果類很多,那么第一次訪問就會很慢
<!--設置優(yōu)先級-->
<load-on-startup>1</load-on-startup>
3.使用注解的方式
1.在類打上@Controller注解
2.在方法上添加@RequestMapping注解
3.在springmvc的配置文件上開啟注解掃描
public class EmployeeController {
@RequestMapping("/employee")
public void employee(HttpServletRequest requst, HttpServletResponse response) throws Exception {
//方法中需要什么對象就寫到形參上
requst.setAttribute("msg","employee!!!!!!!!");
requst.getRequestDispatcher("/hello.jsp").forward(requst,response);
}
必須開啟注解掃描
<!--開啟注解掃描-->
<context:component-scan base-package="com.jd.controller"></context:component-scan>
@RequestMapping可以打在類上也可以打在方法上
如果是打在類上,必須先加類上的映射,再加方法的映射
4.靜態(tài)資源處理
1./和/的區(qū)別
/: 會匹配到url路徑(/index),靜態(tài)資源(.html,.js等),但是不會匹配到.jsp
/: 會匹配到url路徑(/index),靜態(tài)資源(.html,.js等),也會匹配到.jsp
2.為什么springmvc不能使用/*
Struts2里面是有自定義標簽 s:form,jsp文件必須要交有struts2來解析, 所以才會用到/*
SpringMVC是沒有自定義標簽的,也不能處理jsp文件,所以jsp文件必須交回tomcat來處理,所以才會用/,不過濾jsp文件
3.springmvc匹配到靜態(tài)資源的時候出現(xiàn)的重定向錯誤問題
當我們在瀏覽器訪問http://localhost/dept.html,此時的dept.html路徑就會被當做url的映射路徑來匹配
就會去找@RequestMapping有沒有匹配到的路徑,如果有的話就把dept.html當做url路徑來訪問(/dept.???) ?是不會加進去匹配的
也就是說訪問dept.html時,只要有dept的路徑就可以匹配到
解決方案:
方案 1 交由tomcat來處理,tomcat中的default本來就是處理靜態(tài)資源的
方案2. 配置springmvc處理靜態(tài)資源(先匹配url是否有相同的路徑,如果有就交由方法處理,如果沒有才當做靜態(tài)資源處理)(推薦使用)
<!--springMVC的靜態(tài)資源處理配置-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
5.前臺往后臺傳參的方式
@Controller
public class ParamController {
@RequestMapping("/login")
public void login(HttpServletRequest request){
// 1.原始方式 使用request來獲取參數(shù)
System.out.println(request.getParameter("username"));
System.out.println(request.getParameter("password"));
}
2.使用同名匹配的方式
@RequestMapping("/login")
public void login(String username,String password){
System.out.println(("username"));
System.out.println(("password"));
}
// 3.使用對象的方式
@RequestMapping("/login")
public void login(User user){
System.out.println((user));
}
//4.地址欄傳參
@RequestMapping("/delete/{id}")
public void delete(@PathVariable("id") Long id){
System.out.print(id);
}
6.解決中文亂碼問題(post)
<!--編碼過濾器 只對post請求有效-->
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>endoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
7.后臺往前臺傳值
//后臺往前臺傳值
public class ValueController {
//1.使用原始方式傳值
@RequestMapping("/value")
public void value(HttpServletRequest requst, HttpServletResponse response) throws Exception {
//方法中需要什么對象就寫到形參上
requst.setAttribute("msg", "value!!!!!!!!");
requst.getRequestDispatcher("/hello.jsp").forward(requst, response);
}
//2.使用ModelAndView對象
@RequestMapping("value1")
public ModelAndView value() throws Exception {
ModelAndView mv = new ModelAndView();
//設置屬性
mv.addObject("name", "CoderZS");
mv.addObject("password", "123");
User user = new User("zhangsan", "1234");
mv.addObject("user", user);
//mv.addObject(user);
mv.addObject("maYun");//設置默認key為當前對象類型(小寫開頭)
mv.addObject("hahaha");//后面設置相同類型的值會覆蓋之前的值
Map map = new HashMap<>();
map.put("name1", "laowang");
map.put("password", "12344");
mv.addAllObjects(map);
//設置視圖
mv.setViewName("/hello.jsp");
return mv;
}
//3.直接返回對象
//此時會尋找視圖解析器中[前綴+value2+后綴]的頁面/WEB-INF/views/value2.jsp
@RequestMapping("/value2")
public User getUser() {
return new User("CoderZS", "1234");
}
//注意返回String的時候會當做視圖解析(推薦使用)
//如果返回的類型是String就會把返回值當做使徒的一部分
//最終去尋找的路徑[前綴+返回的值+后綴]
//WEB-INF/views/vvv.jsp
@RequestMapping("/value3")
public String getString(Model model) {
model.addAttribute("name", "coderZS");
return "vvv";
}
//4.訪問其他路徑的文件,不需要用到前后綴
@RequestMapping("/value4")
public String getString() {
//希望訪問其他路徑的文件,就不需要用到前綴后綴
//forward:login.html //請求轉發(fā)
return "redirect:login.html";//重定向
}
}
8.文件上傳
//文件上傳
@RequestMapping("/upload")
// 在方法形參上添加MultipartFile對象來接收(不能使用File來接收了)
public void upload(MultipartFile file) throws Exception {
System.out.println(file.getName());//提交表單的文件的參數(shù)名
System.out.println(file.getContentType());//文件類型
System.out.println(file.getOriginalFilename());//提交的文件名
System.out.println(file.getSize());//文件大小
//拷貝文件
FileOutputStream outputStream = new FileOutputStream("/Users/zhangshuai/Desktop/file" + file.getOriginalFilename());
IOUtils.copy(file.getInputStream(), outputStream);
//關閉輸出流
outputStream.close();
}
添加文件上傳解析器
<!--文件上傳解析器-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 設置上傳文件的最大尺寸為1MB -->
<property name="maxUploadSize">
<value>1048576</value>
</property>
</bean>
9.文件下載
//文件下載
@RequestMapping("/download")
public void download(HttpServletResponse response) throws Exception {
System.out.println("---下載-----");
//設置下載響應頭
response.setHeader("Content-Disposition","attachment;filename=a.jpg");
//讀取文件
FileInputStream inputStream=new FileInputStream("/Users/zhangshuai/Desktop/file/1.jpg");
IOUtils.copy(inputStream, response.getOutputStream());
//關閉輸入流
inputStream.close();
}
10.注冊攔截器
- 創(chuàng)建自定義的攔截器類,實現(xiàn)HandlerInterceptor接口
2.注冊攔截器
<!--注冊攔截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!--排除攔截的路徑-->
<mvc:exclude-mapping path="/login"/>
<!--攔截處理類-->
<bean class="com.jd.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
11.返回json格式
在方法的返回值上直接聲明要返回的類型,并且加上@ResponseBody注解
需要添加json解析依賴包
//返回json格式
// 1.在方法的返回值上直接聲明要返回的類型,并且加上@ResponseBody注解
@Controller
public class JsonController {
@RequestMapping("/json")
@ResponseBody
public User json() {
User user = new User("CoderZS", "1234");
return user;
}
@RequestMapping("/json1")
@ResponseBody
public List<User> json1() {
User user = new User("CoderZS", "1234",new Date());
List list = new ArrayList<>();
list.add(user);
return list;
}
//2.使用ObjectMapper
public static void main(String[] args) throws Exception {
User user = new User("CoderZS", "1234");
//轉成json字符串的工具
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
System.out.println(json);
}
}
12.日期處理
后臺往前臺傳json值時(包含日期)
默認輸出的是毫秒值,需要使用特定的格式
解決方案:
方案1:在屬性上添加@JsonFormat注解,注意要添加時區(qū)
方案2: 在總配置文件添加相關配置
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/>
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
前臺往后臺傳參時(包含日期)
1.在日期參數(shù)上添加@DateTimeFormat注解
2.在Controller上添加initBinder方法
@InitBinder
public void initBinder(WebDataBinder binder){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
}
如果兩種都有,會使用initBinder方法