工作流程

控制器
public class MyController implements Controller { @Override public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView(); mv.addObject("message", "Hello Vue"); mv.setViewName("/WEB-INF/jsp/welcome.jsp"); return mv; } }
Dispatch配置文件
<?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"> <bean id="/my.do" class="com.xx.handlers.MyController"/> </beans>
注冊(cè)控制器
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:myDispatch.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
URLPattern中用 / 出現(xiàn)的靜態(tài)資源訪問(wèn)問(wèn)題
解決辦法1
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
解決辦法2 (好用)要寫(xiě)在最上。
<mvc:default-servlet-handler/>
解決辦法3
<mvc:resources mapping="/images/" location="/images/**"/>
映射器
默認(rèn)使用的是BeanNameUrlHandlerMapping
使用SimpleUrlHandlerMapping, 可以實(shí)現(xiàn)多個(gè)url指向同一個(gè)Controller
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="hello.do">myController</prop> // key指定路由
<prop key="my">myController</prop>
<prop key="xx">myControl ler</prop>
</props>
</property>
</bean>
適配器
SimpleControllerHandleAdapter
所有實(shí)現(xiàn)了Controller的Bean,均是通過(guò)該適配器進(jìn)行適配,執(zhí)行的。
HttpRequestHandlerAdapter
所有實(shí)現(xiàn)了HttpRequestHandler的Bean,均是通過(guò)該適配器進(jìn)行適配,執(zhí)行的。
處理器
AbstactController
繼承自WebContentGenerator,它有setSupportedMethods方法,控制請(qǐng)求的方式,默認(rèn)支持GET,POST
<bean id="/hello" class="com.xx.handlers.MyController">
<property name="supportedMethods" value="GET"/>
</bean>
視圖解析器
默認(rèn)的視圖解析器 internalResourceViewResolver
該視圖解析器用于完成對(duì)當(dāng)前web應(yīng)用內(nèi)部資源的封裝和跳轉(zhuǎn),而對(duì)于內(nèi)部資源的查找規(guī)則是,將ModelAndView中指定的視圖名與為視圖解析器配置的前綴和后綴結(jié)合的方式,拼接成一個(gè)Web應(yīng)用內(nèi)部資源路徑。拼接規(guī)則是前綴+視圖名稱+后綴。
缺陷:不能訪問(wèn)外部資源。對(duì)于內(nèi)部資源的定義,只能定義一種格式的資源,存放在同一目錄的同一文件類型的資源文件。
BeanNameViewResolver
將Bean名稱與View綁定
<bean id="taobao" class="org.springframework.web.servlet.view.RedirectView"> <property name="url" value="http://www.taobao.com"/> </bean> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
return new ModelAndView("welcome");
xmlViewResolver
將View視圖專門抽取出來(lái),單獨(dú)定義為一個(gè)xml??梢允褂脁mlViewResolver
<bean class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="location" value="classpath:myViews.xml"/>
</bean>
ResourceBundleViewResolver
將視圖寫(xiě)到,properties文件中
<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="myViews"/>
</bean>
baidu.(class)=org.springframework.web.servlet.view.RedirectView baidu.url=http://www.baidu/.com welcome.(class)=rg.springframework.web.servlet.view.JstlView welcome.url=/WEB-INF/jsp/welcome.jsp
視圖解析器的優(yōu)先級(jí)
視圖解析器有一個(gè)order屬性,專門用于設(shè)置多個(gè)視圖解析器的優(yōu)先級(jí)。數(shù)字越小,優(yōu)先級(jí)越高,數(shù)字相同,先注冊(cè)的優(yōu)先注冊(cè)。
注解式開(kāi)發(fā)
基礎(chǔ)
注冊(cè)組件掃描器
<context:component-scan base-package="com.xx.handlers"/>
@Controller
@RequestMapping("/test") //請(qǐng)求uri命名空間的定義
public class MyController{
@RequestMapping(value = "/ok", method = RequestMethod.GET, params = {"name", "age"})
// method 請(qǐng)求方法的限定
// params 對(duì)請(qǐng)求參數(shù)的限定 !name 表示不能有name參數(shù) age=23 表示參數(shù)必須帶age其值必須為23 age!=25 必須帶age其值不能為25
public ModelAndView getOk(){
return new ModelAndView("/WEB-INF/jsp/welcome.jsp");
}
}
接收請(qǐng)求中的參數(shù)
接收get post請(qǐng)求
@RequestMapping(value = "/pok", method = RequestMethod.POST) public ModelAndView postOk(String name, Integer age){ System.out.println(name); System.out.println(age); return new ModelAndView("/WEB-INF/jsp/welcome.jsp"); }
還可以像servlet中那樣做,用HttpServeletRequest
中文亂碼問(wèn)題解決
web.xml
<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>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
校正求情參數(shù)名
@RequestMapping(value = "/pok", method = RequestMethod.POST) public ModelAndView postOk(@RequestParam(name = "rname") String name, Integer age){ return new ModelAndView("/WEB-INF/jsp/welcome.jsp"); }
Object接收
<form action="/NewWeb/test/pok" method="post">
<label>輸入名稱
<input name="name" type="text">
</label>
<label>輸入年齡
<input name="age" type="number">
</label>
<label>輸入學(xué)校
<input name="school.name" type="text">
</label>
<label>輸入地址
<input name="school.address" type="text">
</label>
<input type="submit" value="提交">
</form>
@RequestMapping(value = "/pok", method = RequestMethod.POST) public ModelAndView postOk(User user){ System.out.println(user); return new ModelAndView("/WEB-INF/jsp/welcome.jsp"); }
路徑變量
@RequestMapping(value = "/user/{name}", method = RequestMethod.GET)
public ModelAndView getOk(@PathVariable("name") String name){
ModelAndView mv = new ModelAndView("/WEB-INF/jsp/welcome.jsp");
return mv;
}
返回ModelAndView
返回string
內(nèi)部資源
@RequestMapping(value = "/ok", method = RequestMethod.GET) public String getOk(){ return "/WEB-INF/jsp/welcome.jsp"; }
外部資源。 仍然要注冊(cè)
@RequestMapping(value = "/ok02", method = RequestMethod.GET) public String getOk02(){ return "baidu"; }
返回Object
用 json 進(jìn)行前后端交互。
將object數(shù)據(jù)轉(zhuǎn)化為json數(shù)據(jù),需要由http消息轉(zhuǎn)換器httpmessageconverter完成。轉(zhuǎn)換器的開(kāi)啟,需要注冊(cè)
<mvc:annotation-driven/>
可以用map
@RequestMapping(value = "/do") @ResponseBody public Object getOk02(){ Map<String, User> map = new HashMap<String, User>(); map.put("user1", new User("張三", 23 )); map.put("user2", new User("李三", 21 )); return map; }
或者list
@RequestMapping(value = "/do") @ResponseBody public Object getOk02(){ List<User> list = new ArrayList<User>(); list.add(new User("qqq",23)); list.add(new User("vvv",21)); return list;
核心技術(shù)
重定向
重定向攜帶參數(shù)
一般通過(guò)HttpSession,或者M(jìn)odelAndView的addObject方法
@RequestMapping(value = "/ok", method = RequestMethod.GET) public ModelAndView getOk(){ ModelAndView mv = new ModelAndView(); mv.addObject("user", "xxx"); mv.setViewName("redirect:do"); return mv; } @RequestMapping(value = "/do") @ResponseBody public Object getOk02(String user){ System.out.println(user); return user; }
@RequestMapping(value = "/ok", method = RequestMethod.GET) public ModelAndView getOk(User user,HttpSession session){ session.setAttribute("user", user); return new ModelAndView("redirect:do"); } @RequestMapping(value = "/do") @ResponseBody public Object getOk02(HttpSession session){ User user = (User) session.getAttribute("user"); return user; }
異常處理
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="/WEB-INF/error/error-page.jsp"/>
<property name="exceptionAttribute" value="ex"/>
<property name="exceptionMappings">
<props>
<prop key="com.xx.exception.NameException">/error/name_error.jsp</prop>
<prop key="com.xx.exception.AgeException">age_error.jsp</prop>
</props>
</property>
</bean>
error-page
<body>
<div>
error page
${ex.message }
</div>
</body>
自定異常處理器
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView mv = new ModelAndView(); mv.addObject("ex", e); mv.setViewName("/erro/error-page.jsp"); if(e instanceof NameException){ System.out.println("name error"); } if(e instanceof AgeException){ System.out.println("age error"); } return mv; }
<bean class="com.xx.exception.resolver"/>
注解式自定義異常處理器
@ExceptionHandler(NameException.class)
public ModelAndView resolveException(Exception e) {
ModelAndView mv = new ModelAndView();
mv.addObject("ex", e);
System.out.println(e.getMessage());
return mv;
}
改代碼寫(xiě)在 ExceptionResolverController中,繼承自BaseController(即MyController)
類型轉(zhuǎn)換器
自定義類型轉(zhuǎn)換器
public class MyDataConvert implements Converter<String, Date> {
@Override
public Date convert(String s) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
注冊(cè)類型轉(zhuǎn)換器
<!-- 注冊(cè)類型轉(zhuǎn)換器--> <bean id="myDataConvert" class="com.lh.handlers.MyDataConvert"/> <!-- 注冊(cè)轉(zhuǎn)換服務(wù)對(duì)象--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters" ref="myDataConvert"/> </bean> <mvc:annotation-driven conversion-service="conversionService"/>
文件上傳
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="1048576"/>
</bean>
@RequestMapping(value = "/test01", method = RequestMethod.POST) public ModelAndView doFile(MultipartFile photo, HttpSession session) throws IOException { if (!photo.isEmpty()){ String path = session.getServletContext().getRealPath("/images"); String fileName = photo.getOriginalFilename(); System.out.println(path); assert fileName != null; if (fileName.endsWith(".jpg") || fileName.endsWith(".png")){ File file = new File(path, fileName); photo.transferTo(file); } }else { return new ModelAndView("fail.jsp"); } return new ModelAndView("success.jsp"); }
攔截器
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return false; // 執(zhí)行false表示被攔截 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
注冊(cè)攔截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.xx.interceptors.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
浙公網(wǎng)安備 33010602011771號(hào)