使用Spring MVC
使用SpringMVC,在web.xml中,配置DispatcherServlet,再配置一个spring-servlet.xml
web.xml
<web-app id="WebApp_ID" version="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">
<display-name>Spring Web MVC Hello World Application</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
spring-servlet这个名字是因为上面web.xml中标签配的值为spring(spring),再加上“-servlet”后缀而形成的spring-servlet.xml文件名,如果改为springMVC,对应的文件名则为springMVC-servlet.xml。
spring-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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">
<context:component-scan base-package="com.howtodoinjava.demo" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
Employee.java
public class Employee implements{
private Integer id;
private String firstName;
private String lastName;
//Setters and Getters
@Override
public String toString() {
return "Employee [id=" + id + ", firstName=" + firstName
+ ", lastName=" + lastName + "]";
}
}
EmployeeDao.java
import java.util.List;
import com.howtodoinjava.demo.model.EmployeeVO;
public interface EmployeeDao{
public List<Employee> getAllEmployees();
}
EmployeeDaoImpl.java
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.howtodoinjava.demo.model.EmployeeVO;
@Repository
public class EmployeeDaoImpl implements EmployeeDao {
public List<Employee> getAllEmployees()
{
List<Employee> employees = new ArrayList<Employee>();
Employee e1 = new Employee();
e1.setId(1);
e1.setFirstName("Lokesh");
e1.setLastName("Gupta");
employees.add(e1);
Employee e2 = new Employee();
e2.setId(2);
e2.setFirstName("Raj");
e2.setLastName("Kishore");
employees.add(e2);
return employees;
}
}
EmployeeService.java
public interface EmployeeService{
public List<Employee> getAllEmployees();
}
EmployeeServiceImpl.java
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EmployeeServiceImpl implements EmployeeService{
@Autowired
EmployeeDao dao;
public List<Employee> getAllEmployees(){
return dao.getAllEmployees();
}
}
employeesListDisplay.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<html>
<head>
<title>Spring MVC Hello World</title>
</head>
<body>
<h2>All Employees in System</h2>
<table border="1">
<tr>
<th>Employee Id</th>
<th>First Name</th>
<th>Last Name</th>
</tr>
<c:forEach items="${employees}" var="employee">
<tr>
<td>${employee.id}</td>
<td>${employee.firstName}</td>
<td>${employee.lastName}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
Spring MVC架构
DispatcherServlet类继承了HttpServlet,在Servlet的init方法调用时DispatcherServlet执行Spring MVC的初始化工作。
Spring容器的创建是在FrameworkServlet的initServletBean()方法中完成的, 这个方法会创建WebApplicationContext对象,并调用其refresh()方法来完成配置文件的加载,配置文件的加载同样是先查找Servlet的init-param参数中设置的路径, 如果没有,会根据namespace+Servlet的名称来查找XML文件。Spring容器在加载时会调用DispatcherServlet的initStrategies方法来完成在DispatcherServlet中定义的初始化工作。在initStrategies方法中会初始化SpringMVC框架需要的8个组件,这8个组件对应的8个Bean对象都保存在DispatcherServlet类中。
Control
HandlerMapping和HandlerAdapters
HandlerMapping负责映射用户的URL和对应的处理类,HandlerMapping接口中只定义了根据一个URL必须返回一个HandlerExecutionChain,可以在这个chain中,添加任意的HandlerAdapters实例来处理这个URL对应的请求。
整个Spring MVC的调用是从DispatcherServlet的doService方法开始的,接着就是调用doDispatch方法,这个方法是主要的处理用户请求的地方。
Control的处理逻辑关键就是在DispatcherServlet的handlerMapping集合中根据请求的URL匹配每个HandlerMapping对象中的某个Handler,匹配成功后将会返回这个Handler的HandlerExecutionChain对象,而在这个对象中会包含用户自定义的多个HandlerInterceptor对象。接下来执行Handler对象的相应方法,如该方法返回一个ModelAndView对象,接下来就去执行View渲染。
Model
对Spring MVC来说,Model是连接Handler和View的桥梁,ModelAndView会持有一个ModelMap对象和一个View对象或者View的名称。ModelMap就是执行模板渲染是所需要的变量对应的实例,如JSP通过request.getAttribute(String)获取的JSTL的标签名对应的对象。
ModelMap传递到View对应的ViewResolvers中,不同的ViewResolvers会对这个Map中的对象有不同的处理方式。