SpringMVC

工作流程

http://blog.csdn.net/zuoluoboy/article/details/19766131

下面对工作流程中的关键词总结提炼(其实就是自己瞎bb):

DispatcherServletDispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:
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";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值