4. applicationContext.xml配置 ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:aop=\"http://www.springframework.org/schema/aop\" xmlns:tx=\"http://www.springframework.org/schema/tx\" xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd\">
classpath:config/hibernate.cfg.xml
[ ]
28 29 30 31 32 33 34 35
二、详解
Spring MVC与Struts从原理上很相似(都是基于MVC架构),都有一个控制页面请求的Servlet,处理完后跳转页面。看如下代码(注解): ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam;
import entity.User;
@Controller //类似Struts的Action public class TestController {
@RequestMapping(\"test/login.do\") // 请求url地址映射,类似Struts的a public String testLogin(@RequestParam(value=\"username\")String username, // @RequestParam是指请求url地址映射中必须含有的参数(除非属性re // @RequestParam可简写为:@RequestParam(\"username\")
if (!\"admin\".equals(username) || !\"admin\".equals(password)) { return \"loginError\"; // 跳转页面路径(默认为转发),该路缀和后缀
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
}
return \"loginSuccess\"; }
@RequestMapping(\"/test/login2.do\")
public ModelAndView testLogin2(String username, String password, int ag // request和response不必非要出现在方法中,如果用不上的话可以去 // 参数的名称是与页面控件的name相匹配,参数类型会自动被转换
if (!\"admin\".equals(username) || !\"admin\".equals(password) || ag return new ModelAndView(\"loginError\"); // 手动实例化Mod的方法返回字符串 }
return new ModelAndView(new RedirectView(\"../index.jsp\")); // // 重定向还有一种简单写法
// return new ModelAndView(\"redirect:../index.jsp\"); }
@RequestMapping(\"/test/login3.do\")
public ModelAndView testLogin3(User user) {
// 同样支持参数为表单对象,类似于Struts的ActionForm,User不需要 String username = user.getUsername(); String password = user.getPassword(); int age = user.getAge();
if (!\"admin\".equals(username) || !\"admin\".equals(password) || ag return new ModelAndView(\"loginError\"); }
return new ModelAndView(\"loginSuccess\"); }
@Resource(name = \"loginService\") // 获取applicationContext.xml中be private LoginService loginService; //等价于spring传统注入方式写get和得代码
@RequestMapping(\"/test/login4.do\") public String testLogin4(User user) {
if (loginService.login(user) == false) { return \"loginError\"; }
return \"loginSuccess\"; } }
以上4个方法示例,是一个Controller里含有不同的请求url,也可以采用一个url访问,通过url参数来区分访问不同的方法,代码如下: ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping(\"/test2/login.do\") // 指定唯一一个*.do请求关联到该Controllerpublic class TestController2 {
@RequestMapping
public String testLogin(String username, String password, int age) { // 如果不加任何参数,则在请求/test2/login.do时,便默认执行该方法
if (!\"admin\".equals(username) || !\"admin\".equals(password) || age return \"loginError\"; }
return \"loginSuccess\"; }
@RequestMapping(params = \"method=1\ public String testLogin2(String username, String password) { // 依据params的参数method的值来区分不同的调用方法 // 可以指定页面请求方式的类型,默认为get请求
if (!\"admin\".equals(username) || !\"admin\".equals(password)) { return \"loginError\"; }
return \"loginSuccess\"; }
@RequestMapping(params = \"method=2\")
public String testLogin3(String username, String password, int age) { if (!\"admin\".equals(username) || !\"admin\".equals(password) || age return \"loginError\"; }
return \"loginSuccess\"; }
39 }
其实RequestMapping在Class上,可看做是父Request请求url,而
RequestMapping在方法上的可看做是子Request请求url,父子请求url最终会拼起来与页面请求url进行匹配,因此RequestMapping也可以这么写: ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(\"/test3/*\") // 父request请求url public class TestController3 {
@RequestMapping(\"login.do\") // 子request请求url,拼接后等价于/test3/ public String testLogin(String username, String password, int age) { if (!\"admin\".equals(username) || !\"admin\".equals(password) || age return \"loginError\"; }
return \"loginSuccess\"; } }
三、结束语
掌握以上这些Spring MVC就已经有了很好的基础了,几乎可应对与任何开发,在熟练掌握这些后,便可更深层次的灵活运用的技术,如多种视图技术,例如 Jsp、Velocity、Tiles、iText 和 POI。Spring MVC框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。