SpringMVC_使用
本文内容纲要:
1.@RequestMapping用法
SpringMVC中,@RequestMapping用来处理请求,比如XXX.do
@RequestMapping("/aaa")//类级别,可以不需要,如果要了,下面所有的请求路径前都需要加入/aaa
publicclassccccontroller{
@RequestMapping("/bbb")
//方法级别,必须有,决定这个方法处理哪个请求,如果有类级别/aaa/bbb
publicStringxxx()
{
//如果没有类级别的就直接请求/bbb
return;
}
}
2:接收带参数的请求,接收用户请求参数值
请求1:/test/start.do?name=zhangsan
请求2:/test/start/zhangsan.do
采用URL模板@RequestMapping("/start/{name}")//这个name随便啥都可以
包含多个@RequestMapping("/start/{name}/{age}")
3:不同请求方法,用不同处理方法getpost
@RequestMapping(value="/start",method=RequestMethod.GET)//处理post就换成POST
另外,如果Servlet想要做到/test/start/zhangsan.do这种请求的话需要URL重写才能做到,或者用/start/*作为Servlet请求控制器,在其中进行截取和判断。
第二种方法:自己写一个URL重写的Filter
第三种方法:使用现成的urlrewriter工具
第四种方法:使用Web服务器的URL重写功能
publicStringstart(@PathVariable("name")stringname){//和上面的对应
return;//方法体里面就可以直接获得参数
}
Servlet中用Filter重写示例
web.xml中:
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appversion="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>Action</servlet-name>
<servlet-class>com.bao.servlet.Action</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Action</servlet-name>
<url-pattern>/Action</url-pattern>
</servlet-mapping>
<filter>
<filter-name>action_name</filter-name>
<filter-class>com.bao.filter.ActionNameFilter</filter-class>
<init-param>
<param-name>pattern</param-name>
<param-value>/action/[^/]+</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>action_name</filter-name>
<url-pattern>/action/*</url-pattern>
</filter-mapping>
</web-app>
controller接收参数的使用
springmvc提供了@RequestParam注释帮助我们获取参数。
用法@RequestParam("接收的参数名")
例如:
@RequestMapping(params="servlet=login")
publicStringlogin(@RequestParam("username")Stringusername,@RequestParam("password")Stringpassword,HttpServletRequestrequest,ModelMapmap){
//处理登录逻辑,省略
return"success";
}
当客户端的URL提交了username参数,password参数,那么我们的Controller就可以接收并处理了。
要注意,提交的username参数和password参数不可以是null,即一定要传这两个参数,不然会抛异常。
另外,@RequestParam可以省略参数名,那么就会以它注释的变量名作为参数名。
视图名的确定。
springmvc可以通过可以通过多种方式确定视图名,在前面的例子中,方法无返回值,视图名根据请求参数确定。Controller方法还是返回一个String类型的值作为视图名,如:
@RequestMapping("edit")
publicvoidedit(@RequestParamintid){...}
则返回的视图为../edit.jsp
使用过低版本SpringMVC的读者都知道:当创建一个Controller时,我们需要直接或间接地实现org.springframework.web.servlet.mvc.Controller接口。一般情况下,我们是通过继承SimpleFormController或MultiActionController来定义自己的Controller的。在定义Controller后,一个重要的事件是在SpringMVC的配置文件中通过HandlerMapping定义请求和控制器的映射关系,以便将两者关联起来。
来看一下基于注解的Controller是如何定义做到这一点的,下面是使用注解的BbtForumController:
packagecom.baobaotao.web;
importcom.baobaotao.service.BbtForumService;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.ModelAttribute;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importjava.util.Collection;
@Controller//<——①
@RequestMapping("/forum.do")
publicclassBbtForumController{
@Autowired
privateBbtForumServicebbtForumService;
@RequestMapping//<——②
publicStringlistAllBoard(){
bbtForumService.getAllBoard();
System.out.println("calllistAllBoardmethod.");
return"listBoard";
}
}
从上面代码中,我们可以看出BbtForumController和一般的类并没有区别,它没有实现任何特殊的接口,因而是一个地道的POJO。让这个POJO与众不同的魔棒就是SpringMVC的注解!
在①处使用了两个注解,分别是@Controller和@RequestMapping。在“使用Spring2.5基于注解驱动的IoC”这篇文章里,笔者曾经指出过@Controller、@Service以及@Repository和@Component注解的作用是等价的:将一个类成为Spring容器的Bean。由于SpringMVC的Controller必须事先是一个Bean,所以@Controller注解是不可缺少的。
真正让BbtForumController具备SpringMVCController功能的是@RequestMapping这个注解。@RequestMapping可以标注在类定义处,将Controller和特定请求关联起来;还可以标注在方法签名处,以便进一步对请求进行分流。在①处,我们让BbtForumController关联“/forum.do”的请求,而②处,我们具体地指定listAllBoard()方法来处理请求。所以在类声明处标注的@RequestMapping相当于让POJO实现了Controller接口,而在方法定义处的@RequestMapping相当于让POJO扩展Spring预定义的Controller(如SimpleFormController等)。
为了让基于注解的SpringMVC真正工作起来,需要在SpringMVC对应的xxx-servlet.xml配置文件中做一些手脚。在此之前,还是先来看一下web.xml的配置吧:
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appxmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5">
<display-name>SpringAnnotationMVCSample</display-name>
<!--Spring服务层的配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--Spring容器启动监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!--SpringMVC的Servlet,它将加载WEB-INF/annomvc-servlet.xml的
配置文件,以启动SpringMVC模块-->
<servlet>
<servlet-name>annomvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>annomvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
web.xml中定义了一个名为annomvc的SpringMVC模块,按照SpringMVC的契约,需要在WEB-INF/annomvc-servlet.xml配置文件中定义SpringMVC模块的具体配置。annomvc-servlet.xml的配置内容如下所示:
<?xmlversion="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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!--①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能-->
<context:component-scanbase-package="com.baobaotao.web"/>
<!--②:启动SpringMVC的注解功能,完成请求和注解POJO的映射-->
<beanclass="org.springframework.web.servlet.mvc.annotation.
AnnotationMethodHandlerAdapter"/>
<!--③:对模型视图名称的解析,即在模型视图名称添加前后缀-->
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"p:suffix=".jsp"/>
</beans>
因为Spring所有功能都在Bean的基础上演化而来,所以必须事先将Controller变成Bean,这是通过在类中标注@Controller并在annomvc-servlet.xml中启用组件扫描机制来完成的,如①所示。
在②处,配置了一个AnnotationMethodHandlerAdapter,它负责根据Bean中的SpringMVC注解对Bean进行加工处理,使这些Bean变成控制器并映射特定的URL请求。
而③处的工作是定义模型视图名称的解析规则,这里我们使用了Spring2.5的特殊命名空间,即p命名空间,它将原先需要通过
启动Tomcat,发送http://localhost/forum.doURL请求,BbtForumController的listAllBoard()方法将响应这个请求,并转向WEB-INF/jsp/listBoard.jsp的视图页面。
在controller中,如果在某方法中需要重定向则return"redirect:xx.html"(与类的RequestMapping的值在同一个路径下)
本文内容总结:
原文链接:https://www.cnblogs.com/penguin-panda/archive/2011/07/08/2100871.html