springmvc不同方式控制器实现与参数传递
添加spring相关包,笔者用最新包3.2.2,可以去官方下载最新包http://www.springsource.org/spring-community-download
模块说明,注释在代码中,方便理解
实例一:使用实现接口的方法实现控制器
web.xml中配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="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"> <servlet> <servlet-name>hello</servlet-name> <!-- 此处用的是hello,所以同目录下的想xml文件名应该为hello-servlet.xml --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
创建关联的hell-servlet.xml(在/WEB-INF/目录下创建)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置控制器,请求路径/welcome.html,clas指定处理类 --> <bean name="/welcome.html" class="com.springmvc.controller.WelcomeController" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 定义视图前缀格式 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 定义视图后缀格式 --> <property name="suffix" value=".jsp"/> </bean> </beans>
编写控制器类WelcomeController.java
package com.springmvc.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; /** * * WelcomeController.java * * @version : 1.1 * * @author : 苏若年 <a href="mailto:DennisIT@163.com">发送邮件</a> * * @since : 1.0 创建时间: 2013-4-12 下午10:52:16 * * TODO : * */ public class WelcomeController extends AbstractController{ @Override protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { System.out.println("com.springmvc.controller.WelcomeController"); //返回视图 return new ModelAndView("welcome"); } }
访问路径:http://localhost:8080/项目名称/welcome.html
实例二:使用Annotation实现控制器
web.xml内容同上
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="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"> <servlet> <servlet-name>user</servlet-name> <!-- 此处用的是user,所以同目录下的想xml文件名应该为user-servlet.xml --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>user</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
user-servlet.xml中的内容
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 指定使用注解方式配置,配置自动扫描的包名, base-package指定自己应用中控制器所在的包目录 <context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有: @Controller 声明Action组件 @Service 声明Service组件 @Service("myMovieLister") @Repository 声明Dao组件 @Component 泛指组件, 当不好归类时. @RequestMapping("/menu") 请求映射 @Resource用于注入,( j2ee提供的 ) 默认按名称装配, @Resource(name="beanName") @Autowired用于注入,(srping提供的) 默认按类型装配 @Transactional(rollbackFor={Exception.class}) 事务管理 @ResponseBody @Scope("prototype")设定bean的作用域 --> <context:component-scan base-package="com.springmvc.demo.controller" /> <!-- 默认的注解映射的支持 --> <mvc:annotation-driven /> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 定义视图前缀格式 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 定义视图后缀格式 --> <property name="suffix" value=".jsp" /> </bean> </beans>
UserController控制器中的内容
package com.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * * UserController.java * * @version : 1.1 * * @author : 苏若年 <a href="mailto:DennisIT@163.com">发送邮件</a> * * @since : 1.0 创建时间: 2013-4-13 上午12:58:05 * * TODO : * */ @Controller public class UserController { @RequestMapping(value={"/list"}) public String listUser(){ //value值不一定要跟方法名相同,value值是请求的url,让请求与对应的方法绑定 System.out.println("执行list操作"); return "list"; //创建视图页面 } @RequestMapping("/insert") public String insert(){ //可以不写value="/insert",上述表示方法也可以 System.out.println("执行insert操作"); return "insert"; //创建视图页面 } @RequestMapping(value="delete") public String delete(){ System.out.println("执行delete操作"); return "delete"; } }
这样就可以实现一个控制器中执行相关的多个请求处理了.
在/WEB-INF/jsp/目录下分别有方法返回的视图页面list.jsp,insert.jsp和delete.jsp页面
针对list业务访问方式举例:http://localhost:8080/项目名称/insert
针对delete业务访问方式举例:http://localhost:8080/项目名称/delete
如何给控制器中传入参数
只需要传入的参数的实参参数名跟形成方法中的形参名一致即可
@RequestMapping(value="select") public String select(String username){ System.out.println("执行查询操作:要查询的用户名为:" + username); return "select"; }
此时访问的时候可以用如下方式传入参数
http://localhost:8080/myproject/select?username=dennisit
这里username必须跟select方法的形参名一致才能保证数据传递成功,在后台打印如下结果:
执行查询操作:要查询的用户名为:dennisit
虽然这里有形参,但我们使用http://localhost:8080/myproject/select
访问也是可以成功的,表示参数为null,可以通过后台打印看出
执行查询操作:要查询的用户名为:null
如何获取值展示到视图页面
方案一(不推荐): 在参数中加入一个Map<String, String>值对,可以按照session的思想理解,使用方式类似
@RequestMapping(value="select") public String select(String username,Map<String,Object> context){ System.out.println("执行查询操作:要查询的用户名为:" + username); context.put("username", username); return "select"; }
访问路径:http://localhost:8080/myproject/select?username=dennisit
WEB-INF/jsp/select.jsp中内容
<body> 执行了查询操作,查询的用户名为${ username } </body>
程序运行结果:执行了查询操作,查询的用户名为dennisit
方案二(推荐):在参数中使用Model对象
@RequestMapping(value="select") public String select(String username,Model model){ System.out.println("执行查询操作:要查询的用户名为:" + username); model.addAttribute("username", username); return "select"; }
访问路径跟执行结果同上,只是用的传递参数的对象由Map集合编程Model对象,用法没有区别
转载请注明出处:[http://www.cnblogs.com/dennisit/archive/2013/04/13/3017910.html]