springMVC Controller配置方式
一.手动配置方式
1.web.xml中dispatcherservlet控制器的的配置
springmvc也是一种基于请求驱动的web框架,并且使用了前端控制器的设计模式。前端控制器就是dispatcherservlet控制器,只要满足web.xml文件中的【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。
<!-- springmvc前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class> <init-param> <!-- contextconfiglocation配置springmvc加载的配置文件;如果不配置默认加载的是/web-inf/servlet名称-servlet.xml --> <param-name>contextconfiglocation</param-name> <param-value>classpath:spring/springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 第一种:*.action 以.action结尾的由dispatcherservlet解析 --> <!-- <url-pattern>*.action</url-pattern> --> <!-- 第二种:/ 所有的访问地址都由dispatcherservlet解析,对于静态文件的解析需要配置不让dispatcherservlet解析;使用此种方式可以实现restful风格的url--> <url-pattern>/</url-pattern> </servlet-mapping>
手动指定spring配置文件的位置,需要使用servletcontext的初始化参数
<!-- 手动指定spring配置文件的位置,需要使用servletcontext的初始化参数 --> <context-param> <param-name>contextconfiglocation</param-name> <param-value>classpath:spring/application-dao.xml,classpath:spring/application-service.xml,classpath:spring/application-transaction.xml</param-value> </context-param>
配置spring提供的监听器,用于监听servletcontext对象的创建,同时为我们创建spring容器放在servletcontext中
<listener> <!-- 配置spring提供的监听器,用于监听servletcontext对象的创建,同时为我们创建spring容器放在servletcontext中,需导spring-web-4.3.8.release.jar 默认情况下:这个配置只能加载位置是在web-inf目录中的spring配置文件,同时文件名必须是applicationcontext.xml(所以spring配置文件在其它位置时需要手动指定配置文件位置) --> <listener-class>org.springframework.web.context.contextloaderlistener</listener-class> </listener>
2.在springmvc.xml中配置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.在springmvc.xml中配置controller
<!-- 配置controlle --> <bean name="/queryitems.action" class="cn.controller.itemcontroller"></bean>
二.注解方式
1.web.xml配置与以上手动配置controller的web.xml一样
2.springmvc.xml中配置注解映射器和注解适配器
方式一:
<!-- (注解)映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.requestmappinghandlermapping"></bean> <!-- (注解)适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter"></bean>
方式二:
<!-- 使用<mvc:annotation-driven>可以代替上边注解映射器和注解适配器 ,它默认加载很多参数绑定方法 比如json转换解析器就默认加载了,实际开发用这个--> <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; }
4.springmvc.xml中配置注解的controller
<!-- 扫描单个 --> <!-- <bean class="cn.controller.annotationcontroller"></bean> -->
<!-- 扫描包下的 --> <context:component-scan base-package="cn.controller"></context:component-scan>