springMVC——Controller配置⽅式
⼀.⼿动配置⽅式(开发中主要⽤注解⽅式,可以直接看标题⼆:注解⽅式)
l中DispatcherServlet控制器的的配置
  SpringMVC也是⼀种基于请求驱动的WEB框架,并且使⽤了前端控制器的设计模式。前端控制器就是DispatcherServlet控制器,只要满⾜l⽂件中的【url-pattern】的规则,这个请求就会交给这个前端控制器(DispatcherServlet),然⽽前端控制器在收到请求后⾃⼰不进⾏任何处理,根据相应的【URL的映射规则】委托给其他的页⾯控制器进⾏处理请求。前端控制器只作为⼀个统⼀的访问点,进⾏全局的流程控制。
contextConfigLocation的值指定springmvc的配置⽂件位置
Servlet拦截匹配规则可以⾃已定义,拦截哪种URL合适?
当映射为@RequestMapping("/user/add")时,为例
1、拦截*.do、*.htm,例如:/user/add.do
  这是最传统的⽅式,最简单也最实⽤。不会导致静态⽂件(jpg,js,css)被拦截。
2、拦截/,例如:/user/add
  可以实现现在很流⾏的REST风格。很多互联⽹类型的应⽤很喜欢这种风格的URL。
  弊端:会导致静态⽂件(jpg,js,css)被拦截后不能正常显⽰。想实现REST风格,事情就是⿇烦⼀些。后⾯有解决办法还算简单。
3、拦截/*,这是⼀个错误的⽅式,请求可以⾛到Action中,但转到jsp时再次被拦截,不能访问到jsp。
<!--解决中⽂乱码问题的过滤器-->
<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>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- springMVC前端控制器 -->
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- contextConfigLocation配置springmvc加载的配置⽂件;如果不配置默认加载的是/WEB-INF/servlet名称-l -->
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:l</param-value>
</init-param>
</servlet>
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <!-- 第⼀种:*.action 以.action结尾的由DispatcherServlet解析 -->
  <!-- <url-pattern>*.action</url-pattern> -->springmvc常用标签
  <!-- 第⼆种:/    所有的访问地址都由DispatcherServlet解析,对于静态⽂件的解析需要配置不让DispatcherServlet解析;使⽤此种⽅式可以实现RESTful风格的url-->
  <url-pattern>/</url-pattern>
</servlet-mapping>
⼿动指定spring配置⽂件(springmvc的配置⽂件可以不⽤指定了,上⾯的contextConfigLacation已经指定好springmvc的配置⽂件)的位置,需要使⽤ServletContext的初始化参数
<!-- ⼿动指定spring配置⽂件的位置,需要使⽤ServletContext的初始化参数 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:l,classpath:l,classpath:l</param-value>
</context-param>
  配置spring提供的,⽤于监听servletContext对象的创建,同时为我们创建spring容器放在servletContext中
<listener>
<!-- 配置spring提供的,⽤于监听servletContext对象的创建,同时为我们创建spring容器放在servletContext中,需导spring-web-4.3.8.RELEASE.jar 默认情况下:这个配置只能加载位置是在WEB-INF⽬录中的spring配置⽂件,同时⽂件名必须是l(所以spring配置⽂件在其它位置时需要⼿动指定配置⽂件位置)      -->
<listener-class>org.t.ContextLoaderListener</listener-class>
</listener>
2.在l中配置1.处理器映射器  2.处理器适配器
3.视图解析器(注意默认使⽤了jstl,所以必须导⼊jstl包)
如下视图解析器配置了前缀和后缀两个属性,因此控制器类的视图路径仅需提供⽂件名,视图解析器将会⾃动添加前缀和后缀。
        例如:1.视图解析器中设置了这两个属性时
            <property name="prefix" value="/WEB-INF/jsp/"></property><property name="suffix" value=".jsp"></property>
            2.Controller类中返回的ModelAndView设置了放回视图名:modelAndView.setViewName("items");
              3.则访问controller成功后访问的url为...../WEB-INF/jsp/items.jsp
<!--  配置处理器映射器在配置Controller时需要指定bean的name;bean的name作为url进⾏查 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--  配置处理器适配器 ;所有的处理器适配器都实现了HandlerAdapter接⼝ -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 视图解析器 ;解析jsp,默认使⽤jstl标签,所以必须导jstl包 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置view的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 设置view的后缀 -->
<property name="suffix" value=".jsp"></property>
<!-- 指定前后缀后modelAndView.setViewName("");⾃动在前后加上前后缀 -->
</bean>
3.编写controller的java代码
  ⼿动配置controller时对应的java类需实现Controller接⼝,并重写实现⽅法
public class ItemController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
String name = "普通name";
//返回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相当于request的setAttribute();
modelAndView.addObject("name",name);
//指定视图
modelAndView.setViewName("items");
return modelAndView;
}
}
4.在l中配置controller
   <!-- 配置Controlle -->
<bean name="/queryItems.action" class="cn.controller.ItemController"></bean>
⼆.注解⽅式
l配置与以上⼿动配置controller的l⼀样
l中配置注解映射器和注解适配器
    ⽅式⼀:
<!-- (注解)映射器 -->
<bean class="org.springframework.web.hod.annotation.RequestMappingHandlerMa
pping"></bean>
<!-- (注解)适配器 -->
<bean class="org.springframework.web.hod.annotation.RequestMappingHandlerAdapter"></bean>
    ⽅式⼆(开发⽤这种):
    <!-- 使⽤<mvc:annotation-driven>可以代替上边注解映射器和注解适配器 ,它默认加载很多参数绑定⽅法
⽐如json转换解析器(springmvc默认使⽤jackson,导⼊依赖即可)就默认加载了,实际开发⽤这个-->
<mvc:annotation-driven></mvc:annotation-driven>
3.编写通过注解实现的controller的java代码
//使⽤@Controller说明此类是⼀个控制器
@Controller
//为了对url进⾏分类管理,可以在这⾥定义根路径,⽐如此例⼦访问url为/item/queryItems
@RequestMapping("/item")
public class AnnotationController {
@Autowired
private ItemService itemService;
/**
* 查询item
* @param itemQueryVo
* @return
*/
/
/@RequestMapping实现⽅法和url的映射,⼀个⽅法对应⼀个url,⼀般值设置和⽅法名⼀样    @RequestMapping("/queryItems")
public ModelAndView queryItems(ItemQueryVo itemQueryVo) {
ModelAndView modelAndView = new ModelAndView();
List<ItemCustom> itemsList = itemService.findItemsList(itemQueryVo);
//相当于request的setAttribute();
modelAndView.addObject("itemsList",itemsList);
//指定视图
modelAndView.setViewName("item/itemsList");
return modelAndView;
}
l中配置注解的controller
<!-- 扫描单个 -->
<!-- <bean class="cn.controller.AnnotationController"></bean> -->
<!--扫描包下的-->
<context:component-scan base-package="cn.controller"></context:component-scan>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。