Spring MVC
[TOC]
配置文件
配置核心控制器
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- SpringMVC的配置文件无蜂,在src目錄下 -->
<param-value>classpath:springMVC-servlet.xml</param-value>
</init-param>
<!-- 啟動順序:表示啟動容器時初始化該Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!-- 攔截所有.do請求 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
解決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>
Spring MVC基本配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
</beans>
servlet 掃描器
<!-- servlet掃描器 , 掃描指定包下的所有類 -->
<context:component-scan base-package="com.zzsong.controller"></context:component-scan>
視圖解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/index/" />
<property name="suffix" value=".jsp" />
</bean>
文件上傳解析器
<!-- 文件上傳的 解析器的配置 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 最大緩存大小 -->
<property name="maxInMemorySize">
<value>40960</value>
</property>
<!-- 上傳最大限制 -->
<property name="maxUploadSize">
<value>10485760000</value>
</property>
<!-- 上傳文件編碼 -->
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
</bean>
JSON解析器
<!-- JSON解析器 -->
<bean id="stringConverter"
class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean id="jsonConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="stringConverter" />
<ref bean="jsonConverter" />
</list>
</property>
</bean>
攔截器
-
攔截器的配置
<!-- 配置攔截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 設(shè)置攔截路徑 --> <mvc:mapping path="/**" /> <!-- 攔截器完全限定名 --> <bean class="com.zzsong.interceptor.MyInterceptor"> <!-- 攔截器內(nèi)存儲不攔截的路徑 --> <property name="allowpath"> <list> <value>hello.do</value> <value>login.do</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors>
-
攔截器的使用
實現(xiàn)接口的方式
public class MyInterceptor implements HandlerInterceptor { public List<String> allowpath; public List<String> getAllowpath() { return allowpath; } public void setAllowpath(List<String> allowpath) { this.allowpath = allowpath; } //整個請求處理完畢回調(diào)方法项郊,即在視圖渲染完畢時回調(diào)沪停,如性能監(jiān)控中我們可以在此記錄結(jié)束時間并輸出消耗時間页慷,還可以進行一些資源清理午绳,類似于try-catch-finally中的finally棚瘟,但僅調(diào)用處理器執(zhí)行鏈中preHandle返回true的攔截器的afterCompletion氯葬。 @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } // 后處理回調(diào)方法虚茶,實現(xiàn)處理器的后處理(但在渲染視圖之前),此時我們可以通過modelAndView(模型和視圖對象)對模型數(shù)據(jù)進行處理或?qū)σ晥D進行處理丧鸯,modelAndView也可能為null蛤铜。 @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } // 預(yù)處理回調(diào)方法,實現(xiàn)處理器的預(yù)處理(如登錄檢查)骡送,第三個參數(shù)為響應(yīng)的處理器 //返回值:true表示繼續(xù)流程(如調(diào)用下一個攔截器或處理器);false表示流程中斷(如登錄檢查失斝跫恰)摔踱,不會繼續(xù)調(diào)用其他的攔截器或處理器,此時我們需要通過response來產(chǎn)生響應(yīng)怨愤; @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { String servletPath = arg0.getServletPath(); for (String string : allowpath) { if (servletPath.contains(string)) { return true; } } arg1.sendRedirect("login.do"); return true; } }
繼承類的方式
public class MyInterceptor extends HandlerInterceptorAdapter { public List<String> allowpath; public List<String> getAllowpath() { return allowpath; } public void setAllowpath(List<String> allowpath) { this.allowpath = allowpath; } // 預(yù)處理回調(diào)方法派敷,實現(xiàn)處理器的預(yù)處理(如登錄檢查),第三個參數(shù)為響應(yīng)的處理器 //返回值:true表示繼續(xù)流程(如調(diào)用下一個攔截器或處理器)撰洗;false表示流程中斷(如登錄檢查失斃河洹),不會繼續(xù)調(diào)用其他的攔截器或處理器差导,此時我們需要通過response來產(chǎn)生響應(yīng)试躏; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String servletPath = request.getServletPath(); for (String string : allowpath) { if (servletPath.contains(string)) { return true; } } response.sendRedirect("login.do"); return true; } }
?
使用方法
基本使用方式
@Controller
public class MyController {
@RequestMapping("/login.do")
public String login() {
return "forward:/hello.do";
}
}
窄化請求映射
package cn.javass.chapter6.web.controller;
@Controller
@RequestMapping(value="/user") //①處理器的通用映射前綴
public class HelloWorldController2 {
@RequestMapping("/login.do") //②相對于①處的映射進行窄化
public String login() {
return "forward:/hello.do";
}
}
轉(zhuǎn)發(fā)到其他servlet
/**
* 轉(zhuǎn)發(fā)到其他servlet
*/
@RequestMapping("/login.do")
public String login() {
return "forward:/hello.do";
}
重定向到其他servlet
/**
* 重定向到其他servlet
*/
@RequestMapping("/login.do")
public String login() {
return "redirect:/hello.do";
}
帶參轉(zhuǎn)發(fā)
-
方式一
@RequestMapping("/hello.do") public ModelAndView index() { ModelAndView mv = new ModelAndView(); StuInfo s = new StuInfo(); s.setName("sdafas"); s.setPsw("21412"); //等同于request.setAttribute mv.addObject("msg", s); //將需要跳轉(zhuǎn)到JSP名放入 mv.setViewName("hello"); return mv; }
-
方式二
@RequestMapping("/hello.do") public String index(ModelMap mm) { StuInfo s = new StuInfo(); s.setName("sdafas"); s.setPsw("21412"); mm.addAttribute("msg", s); return "hello"; }
文件上傳
@RequestMapping("/upload.do")
public String upload(@RequestParam("file") CommonsMultipartFile cf[], HttpServletRequest
request, String name) {
String path = request.getServletContext().getRealPath("/");
for (int i = 0; i < cf.length; i++) {
String fileName = cf[i].getOriginalFilename();
try {
cf[i].transferTo(new File(path, fileName));
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
}
return "forward:/hello.do";
}
AJAX
-
直接返回字符串
@RequestMapping("/account.do") @ResponseBody public void account(String account, HttpServletResponse response) throws IOException { PrintWriter writer = response.getWriter(); if ("123".equals(account)) { writer.print("ok"); } else { writer.print("err"); } writer.close(); }
-
返回集合或?qū)ο?/strong>
@RequestMapping("/getstu.do") @ResponseBody public List<StuInfo> getstu() throws IOException { List<StuInfo> stus = new ArrayList<>(); StuInfo s1 = new StuInfo("小紅", "123"); StuInfo s3 = new StuInfo("小明", "456"); stus.add(s1); stus.add(s3); return stus; }
-
返回JSON
需要使用相關(guān)的JSON處理jar包
@RequestMapping("/getstu.do") @ResponseBody public String getstu() throws IOException { List<StuInfo> stus = new ArrayList<>(); StuInfo s1 = new StuInfo("小紅", "123"); StuInfo s3 = new StuInfo("小明", "456"); stus.add(s1); stus.add(s3); return JSON.toJSONString(stus); }