本案例的目标是加强对@Controller @RequestMapping @Resource @Service 的感性认识,能过知道这几个注解是怎么用的,以及spring和springmvc的整合。
首先看一下本案例的总图:
上面的beans.xml的代码如下:它主要是对service层进行包扫描。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:mvc="http://www.springframework.org/schema/mvc" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xsi:schemaLocation="http://www.springframework.org/schema/mvc 7 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 8 http://www.springframework.org/schema/beans 9 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 10 http://www.springframework.org/schema/context 11 http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 12 13 <!-- 对所有的service进行包扫描 --> 14 <context:component-scan base-package="com.qls.service"/> 15 </beans>
springmvc-servlet.xml的代码如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-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"> <!-- 对所有的Controller进行包扫描 --> <context:component-scan base-package="com.qls.controller"/> <!-- 内部资源视图解析器 --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
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"> <!-- 以下是整合spring和springmvc 首先spring的配置,其次springmvc的配置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- spring的配置 --> <!-- springmvc的配置: --> <!-- 配置DispatcherServlet这个类 --> <servlet> <servlet-name>ouyangfeng</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 设置初始变量,指定类路径 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ouyangfeng</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
ShowAllMemberController类代码如下:
1 package com.qls.controller; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import javax.annotation.Resource; 7 8 import org.springframework.stereotype.Controller; 9 import org.springframework.web.bind.annotation.RequestMapping; 10 11 import com.qls.domain.Student; 12 import com.qls.service.ShowAllMemberService; 13 14 @Controller 15 /** 16 * @Controller这个注解声明这个类是一个控制器Controller. 17 * 但前提必须是在配置文件中进行包扫描。即: 18 * <context:component-scan base-package="com.qls.controller"> 19 * 其中base-package中的com.qls.controller是ShowAllMemberController这个类所在的包。 20 */ 21 @RequestMapping("/ouyangfeng") 22 /** 23 * 对这个类ShowAllMemberController进行映射。 24 * 其实这句话相当于配置文件中的 25 * <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping 26 " name="ouyangfeng"> 27 * </bean> 28 * 如果不在类上面写上这句话: 29 * @RequestMapping("/ouyangfeng");则其默认以类名进行映射的.即@RequestMapping("/showAllMemberController"); 30 */ 31 public class ShowAllMemberController { 32 @Resource 33 ShowAllMemberService showAllMemberService; 34 //这个RequestMapping()之所以写成.do的形式是因为在web.xml中配置DispatcherServlet这个类时写成.do的形式。 35 @RequestMapping("/listAll.do") 36 public String listAll(Map<String,Object> model){ 37 List<Student> listAll = ShowAllMemberService.listAll(); 38 model.put("sixi", listAll); 39 return "showAllMember";//这是个逻辑名。 40 } 41 }
ShowAllMemberService类的代码如下:
1 package com.qls.service; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import org.springframework.stereotype.Service; 9 10 import com.qls.domain.Student; 11 12 @Service 13 /** 14 * @Service这个注解说明这个类是Service层的,这个层是处理一些业务逻辑的。 15 * 前提条件必须也要在配置文件进行配置:包扫描 16 * 即:<context:component-scan base-package="com.qls.service"> 17 * 对service进行包扫描一般是放在beans.xml中。不和springmvc-servlet.xml放在一块写。 18 */ 19 public class ShowAllMemberService { 20 //把map集合中放入10条数据: 21 private Integer id=0; 22 private static Map<Integer,Student> map=new HashMap<Integer, Student>(); 23 //利用静态代码块把map中添加十条数据: 24 static{ 25 for (int i = 0; i < 10; i++) { 26 Student student = new Student(); 27 student.setId(i); 28 student.setName("tony"+i); 29 student.setId(20+i); 30 map.put(i, student);//这句话很重要,不要遗忘了。 31 } 32 } 33 //获取所有的记录: 34 public static List<Student> listAll(){ 35 //把map集合放入ArrayList中。 36 return new ArrayList<Student>(map.values()); 37 } 38 }
showAllMember.jsp的代码如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basePath%>"> 12 13 <title>My JSP 'showAllMember.jsp' starting page</title> 14 15 <meta http-equiv="pragma" content="no-cache"> 16 <meta http-equiv="cache-control" content="no-cache"> 17 <meta http-equiv="expires" content="0"> 18 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 19 <meta http-equiv="description" content="This is my page"> 20 <!-- 21 <link rel="stylesheet" type="text/css" href="styles.css"> 22 --> 23 24 </head> 25 26 <body> 27 This is my show all member page. <br> 28 显示所有的人员:<br> 29 <table border="1"> 30 <tr> 31 <td>序号</td> 32 <td>姓名</td> 33 <td>年龄</td> 34 </tr> 35 <c:forEach items="${sixi}" var="s"> 36 <tr> 37 <td>${s.id+1}</td> 38 <td>${s.name}</td> 39 <td>${s.age}</td> 40 </tr> 41 </c:forEach> 42 43 </table> 44 </body> 45 </html>
总结:1.通过上面的例子我们可以知道,访问一个web项目最重要的就是Controller。上面的Controller类通过注解@Resource调用了Service层的方法。
由此我们可以知道单独把Service层提取出来,是为了避免Controller(控制器层)显得过于多。不便以后维护。
2.@RequestMapping 翻译成中文就是请求映射,相当于配置文件中BeanNameUrlHandlerMapping.没有其他作用了。
@Controller. @Service 只要对其进行包扫描spring 容器会自然把相应的类看成Controller 和Service,这个不需要程序员担心。
3.在整合Spring和springmvc是只需在web.xml文件中加上以下代码前提是你已经配置好了DispatchServlet这个类了。
1 <!-- 以下是整合spring和springmvc 首先spring的配置,其次springmvc的配置--> 2 <context-param> 3 <param-name>contextConfigLocation</param-name> 4 <param-value>classpath:beans.xml</param-value> 5 </context-param> 6 <listener> 7 <listener-class>org.springframework.web.context.ContextLoaderListener 8 </listener-class> 9 </listener>
特别是这个ContextLoaderListener这个类不能遗忘了。