SpringMVC

来源:互联网 发布:esi数据库检索入口 编辑:程序博客网 时间:2024/05/21 18:45

SpringMVC

一. DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。

DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;

2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);

3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);

4、通过ViewResolver解析逻辑视图名到具体视图实现;

5、本地化解析;

6、渲染具体的视图等;

7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

在web.xml中配置DispatcherServlet

    <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:config.xml</param-value>        </init-param>    </servlet>    <servlet-mapping>        <servlet-name>springmvc</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>

在resource资源文件新建config.xml 用来注入对象

之后可以写SpringMVC的核心Controller 控制器 DispatcherServlet根据不同的请求控制不同控制器来进行处理。

实现Controller控制器一般有两种方式一种是实现Controller接口

public class InputProductController implements Controller {    @Override    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {        System.out.println("handleRequest in InputProductController is called");        return new ModelAndView("/WEB-INF/ProductForm.jsp");//new ModelAndView("/WEB-INF/ProductDetail.jsp", "product", p);    }}

之后要在config.xml文件中注入Controller对象

//这里name相当于actionnamebean name="/product_input.action"        class="com.controller.InputProductController" />

第二种方式是使用用注解的方式

@Controllerpublic class SaveProductController {    @RequestMapping("/product_save3.action")    //这里的ProductForm 类似于Struts中的模型驱动    //Model 相当于在request中setAtrubute    public String productSave(ProductForm pf, Model model){        Product p = new Product();        p.setName(pf.getName());        p.setDescr(pf.getDescr());        p.setPrice(pf.getPrice());        model.addAttribute("product", p);        return "jsp/ProductDetail";    }    @RequestMapping("/update.action")    public String update(){        System.out.println("update method");        return "jsp/ProductDetail";    }
@Controller@RequestMapping("/product")//在类名前加mapping注解之后在里面的方法的返回Actionname之前要加上类名的productpublic class ProductController {    @Autowired//此注解可以自动加载注入下面的对象 对应的实现类应该前应加入@Service    private IProductService proService;// = new ProductServiceImpl();    @RequestMapping(value="/addProduct.action", method=RequestMethod.POST)    //RedirectAttributes 重定向后可以加message    public String addProduct(ProductForm pf, RedirectAttributes ra){        Product p = proService.addProduct(pf);        ra.addFlashAttribute("msg", "add successfully!");        //重定向另一个Action        return "redirect:/product/product_view.action/" + p.getPid();    }    //可以在Action后面加/加上一个参数    @RequestMapping("/product_view.action/{pid}")    public String showProduct(@PathVariable long pid, Model model){        Product p = proService.getProductById(pid);        model.addAttribute("product", p);        return "jsp/ProductDetail";    }}

之后要在config.xml中配置扫面注解

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="        http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/mvc        http://www.springframework.org/schema/mvc/spring-mvc.xsd             http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context.xsd">    <!-- 组件扫描,扫描该报下的所有组件(Controller) -->    <context:component-scan base-package="com.annotation.controller" />    <!-- 组件扫描,将该包下的类注入到指定的接口中 -->    <context:component-scan base-package="com.service.impl"/>    <mvc:annotation-driven />    <!--         设定最终的虚拟视图,前缀为/WEB-INF/jsp/, 后缀为.jsp        假如@RequestMapping所注解的方法返回值为abc,则完整的视图为/WEB-INF/jsp/abc.jsp     -->    <bean        class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="prefix" value="/WEB-INF/"></property>        <property name="suffix" value=".jsp"></property>    </bean></beans>