工作流程
http://blog.youkuaiyun.com/zuoluoboy/article/details/19766131
下面对工作流程中的关键词总结提炼(其实就是自己瞎bb):
DispatcherServlet | DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下: 1. 文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析; 2. 通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器); 3. 通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器); 4. 通过ViewResolver解析逻辑视图名到具体视图实现; 5. 本地化解析; 6. 渲染具体的视图等; 7. 如果执行过程中遇到异常将交给HandlerExceptionResolver来解析 |
HandlerMapping | 为每个请求找到合适的处理器handler,比如@RequestMapping(“url映射”) |
handler | 处理方法 |
//TODO |
web.xml中配置。里面设置了中央控制器DispatcherServlet:
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- spring配置文件位置,默认位置为/WEB-INF/[servlet-name]-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-mvc.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>
<!-- 可以把post请求转化为put,delete请求 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
核心文件配置:
<!-- 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 将jsp页面放置在web-info中可以保护这些页面不被浏览器直接访问 -->
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 加入对静态资源的处理:
servlet在找页面时,走的是dispatcherServlet路线。找不到的时候会报404。加上这个默认的servlet时候,servlet在找不到的时候会去找静态的内容 -->
<mvc:default-servlet-handler/>
<!-- 作用是向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、
PersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor
这 4 个BeanPostProcessor。 注册这4个 BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。
<context:annotation-config /> -->
<!-- 在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component
@Controller@Service等这些注解的类,则把这些类注册为bean -->
<context:component-scan base-package="diyun" ></context:component-scan>
<!-- (1) 自动注册DefaultAnnotationHandlerMapping(处理url映射)与AnnotationMethodHandlerAdapter
两个bean,是spring MVC为@Controller分发请求所必须的;
(2)提供一系列:数据绑定,数字和日期的format(@NumberFarmat,@DateTimeFormat),xml,json的默认读写支持
-->
<mvc:annotation-driven />
<!-- 不经过handler而直接转发
<mvc:view-controller path="/success" view-name="success"/>
-->
<!-- 配置errorfield国际化资源文件 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>
<!-- 文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="102400"></property>
</bean>
Controller:
/*
* 备忘:
* Converter接口:自定义类型转化器
* View接口:自定义视图
*
*/
@Controller
//@SessionAttributes(value={},types={String.class})
//在model.addAttribute时,将属性也放到session中(示例将所有String类型放到session中)
public class TestController {
@Autowired
private UserDao userDao;
@Autowired
private FavouriteDao favouriteDao;
@RequestMapping("/list")//value支持" * "通配符
/*
* @RequestParam获取url传参,例如xxx?id=1,获得参数id=1.required属性配置该传参是否必须
* @CookieValue获取cookie
* 支持原生api作为参数,如request,response,session等
*/
public ModelAndView showList(@RequestParam(value="id",required=false,defaultValue="1") Integer id
,@CookieValue("NAME") String name,HttpServletRequest request){
ModelAndView mav=new ModelAndView("success");//对应success.jsp
mav.addObject("obj","obj"); //相当于request.setAttribute
return mav;
}
@RequestMapping(value="/addUser",method=RequestMethod.GET)
public String addUser(Model model){//传入Map或者Model,相当于request.setAttribute
model.addAttribute("user",new User());//必须加。spring认为表单一定回显,对应前端modelAttribute=user
model.addAttribute("flist",favouriteDao.list());
return "addUser";//被视图解析器解析,对应/WEB-INF/pages/addUser.jsp
}
@RequestMapping(value="/addUser",method=RequestMethod.POST)
/*
* User user:级联属性,前端表单name属性为user.xxx,提交后自动匹配填充
*/
public String submitForm(@Valid User user,BindingResult errors,Model model){
//前端通过<form:errors>显示错误信息,可以通过配置国际化资源文件来指定信息内容,如:NotEmpty.user.name=用户名不能为空
if(errors.hasErrors()){
System.out.println(errors.getFieldError());
model.addAttribute("flist",favouriteDao.list());
return "/addUser";
}
userDao.add(user);
return "list";
}
//对应前端<input type="hidden" name="_method" value="DELETE">
@RequestMapping(value="/delete/{id}",method=RequestMethod.DELETE)
public String delete(@PathVariable Integer id){
userDao.delete(id);
return "redirect:/list";
}
@RequestMapping(value="/addUser/{id}")//对于路径/addUser/666,获得参数id=666
public String updateUser(@PathVariable Integer id,Model model){
model.addAttribute("user",userDao.get(id));
model.addAttribute("flist",favouriteDao.list());
return "addUser";
}
@RequestMapping(value="/addUser",method=RequestMethod.PUT)
public String update(User user){
userDao.add(user);
return "redirect:/list";
}
// //该注释修饰的方法,会在每个目标方法执行之前先调用
// @ModelAttribute
// public void demoMethod(){}
//
// //数据校验,类型转化。。等等
// @InitBinder
// public void initBinder(WebDataBinder binder){}
//
//springMVC处理json
//requestBody直接把返回值传递给客户端
@ResponseBody
@RequestMapping(value="/button",
produces={"application/json;charset=UTF-8"})//设定返回内容的类型(可不加)
public String testJson(@RequestBody String testBody){//获取前台传来的数据
System.out.println("路过~");
return "lala";//向后台发送数据
}
@RequestMapping(value="/testUpload")
public String testUpload(@RequestParam("file") MultipartFile file){
System.out.println(file.getOriginalFilename());
return "addUser";
}
}