项目地址:http://www.springsource.org/
文档地址: http://www.springsource.org/documentation
下载: http://www.springsource.org/download
spring mvc 简介:
Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。spring mvc 实现的功能类似struts 提供的mvc 解决方案,但是比spring 更加轻量级且更加灵活。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
Spring 的 Web MVC 框架是围绕 DispatcherServlet
设计的,它把请求分派给处理程序,同时带有可配置的处理程序映射、视图解析、本地语言、主题解析以及上载文件支持。默认的处理程序是非常简单的 Controller
接口,只有一个方法 ModelAndView handleRequest(request, response)
。
由于不在本文讨论范畴,为了方便起见,笔者仅对dao层和service层做了简单的实现,如需连接数据源,请读者自行修改。
所需jar包:
web.xml 配置:
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>Spring character encoding filter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>Spring character encoding filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping>
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: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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 自动搜索 所有配置的autowired或者resource都是在该目录下面--> <context:component-scan base-package="com"></context:component-scan> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- @Autowired --> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> <!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/page/" /> <property name="suffix" value=".jsp" /> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> </bean> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n/messages" /> <!-- 配置rest,根据不同请求,做不同的响应 如 /blog/1.json /blog/1.xml--> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <!-- 在没有扩展名时即: "/user/1" 时的默认展现形式 --> <property name="defaultContentType" value="application/xml" /> <!-- 扩展名至mimeType的映射,即 /user.json => application/json --> <property name="mediaTypes"> <map> <entry key="html" value="text/html" /> <entry key="json" value="application/json" /> <entry key="xml" value="application/xml" /> </map> </property> <property name="defaultViews"> <list> <!-- 输出为JSON数据--> <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> <property name="prefixJson" value="false" /> </bean> <!-- 输出为xml数据--> <bean id="marshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView"> <constructor-arg> <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> <property name="classesToBeBound"> <array> <value>com.mvc.domain.User</value> <value>com.mvc.domain.UserList</value> </array> </property> </bean> </constructor-arg> </bean> </list> </property> </bean> <!-- 使用resource标签 --> <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" /> </beans>
contoller 代码:
package com.mvc.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.mvc.domain.User;
import com.mvc.domain.UserList;
import com.mvc.service.UserService;
/**
* @Project: spring_mvc_test
*
*
* @Annotation: 用户controller
*
* @Date:2011-9-5
*
*/
@Controller
@RequestMapping("/user")
public class UserController{
//@Resource(type=com.mvc.service.UserServiceImpl.class)
@Autowired
private UserService userServiceImpl;
@InitBinder
public void initBinder(WebDataBinder binder) {
//设置日期转换
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(
dateFormat, false));
}
@RequestMapping("hello")
public ModelAndView hello(){
ModelAndView mav = new ModelAndView();
mav.setViewName("hello");
mav.addObject("message", "hello every body !");
return mav;
}
@RequestMapping("register")
public ModelAndView register(){
ModelAndView mav = new ModelAndView();
mav.setViewName("register");//后台的jsp页面名称
return mav;
}
/**
*
* 传递表单内容
*
* Last Modification Time: 2011-9-5
*
* @param request
* @param response
* @param user 传递过来的用户
* @return
*/
@RequestMapping(value="/show", method = RequestMethod.POST)
public ModelAndView showUser(HttpServletRequest request,HttpServletResponse response,User user){
System.out.println("host: " + request.getRemoteHost());
System.out.println("userinfo: " + user);
ModelAndView mav = new ModelAndView();
mav.setViewName("display");//后台的jsp页面名称
mav.addObject("birthday",user.getBirthday());
mav.addObject("id",user.getId());
mav.addObject("money",user.getMoney());
mav.addObject("name",user.getName());
mav.addObject("user",user);
userServiceImpl.addUser(user);
return mav;
}
@RequestMapping("/find/{id}")
public ModelAndView getUserById(@PathVariable int id,HttpServletRequest request,HttpServletResponse response){
ModelAndView mav = new ModelAndView();
mav.setViewName("display");//后台的jsp页面名称
System.out.println("id: " + id);
User user = new User();
user.setName("aaaaa");
mav.addObject("user",user);
return mav;
}
/**
* 跳转到doadd的jsp页面
*
*
* Last Modification Time: 2011-9-5
*
* @return
*/
@RequestMapping("/doaddview")
public ModelAndView doaddview(){
ModelAndView mav = new ModelAndView();
mav.setViewName("add");//后台的jsp页面名称
return mav;
}
@RequestMapping(value="add")
public String doadd(HttpServletRequest request,HttpServletResponse response){
System.out.println("Hello aaaaaaa ");
request.setAttribute("message", "Hello aaaaa ! ,@RequestMapping(value='/add')");
return "hello";
}
/**
* 通过这种方法也可以获得user
*
* Last Modification Time: 2011-9-5
*
* @param user
*/
@RequestMapping(value="add")
public void addUser(@ModelAttribute("user") User user){
System.out.println("controller 级联");
System.out.println(user.getName());
}
@RequestMapping("/showuser")
public ModelAndView getById(){
User user = new User();
user.setBirthday(new Date());
user.setId(111);
user.setMoney(112.0f);
user.setName("aaaaaaaaa");
return new ModelAndView("display", "user", user);
}
@RequestMapping("/showsth")
public ModelAndView getByIdAndName(){
List list = new ArrayList();
User user = new User();
user.setBirthday(new Date());
user.setId(111);
user.setMoney(112.0f);
user.setName("aaaaaaa");
list.add(user);
list.add(user);
list.add(user);
list.add(user);
list.add(user);
list.add(user);
UserList userList = new UserList();
userList.setList(list);
userList.setName("UserList");
return new ModelAndView("display", "userlist", userList);
}
}
user dao 代码:
package com.mvc.dao;
import com.mvc.domain.User;
/**
* @Project: spring_mvc_test
*
* @Annotation: 用户dao
*
* @Date:2011-9-5
*
*/
public interface UserDAO {
public void addUser(User user);
public User findUser(int id);
}
user dao impl 代码:
package com.mvc.dao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import com.mvc.domain.User;
/**
* @Project: spring_mvc_test
*
* @Annotation: user dao 的实现类,
* Data Access Object or DAO
* 使用@Repository来标识
*
* @Date:2011-9-5
*
*/
@Repository
@Scope("prototype")
public class UserDAOImpl implements UserDAO{
@Override
public void addUser(User user) {
}
@Override
public User findUser(int id) {
return null;
}
}
user 类代码:
package com.mvc.domain;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
* @Project: spring_mvc_test
*
* @Annotation: 用户
*
* @Date:2011-9-5
*
*/
@XmlRootElement(name="user")
public class User {
private int id;
private String name;
private Date birthday;
private float money;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
public User() {}
public User(String name) {
this.name = name;
}
public User(float money) {
this.money = money;
}
public void showName() {
System.out.println(this.name);
}
@Override
public String toString() {
return "id=" + this.id + " name=" + this.name + " birthday="
+ this.birthday + " money=" + this.money;
}
}
userlist 代码:
package com.mvc.domain;
import java.util.List;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* @Project: spring_mvc_test
*
* @Annotation:
*
* @Date:2011-9-7
*
*/
@XmlRootElement
public class UserList {
private String name;
private List list;
@XmlElements({
@XmlElement(name = "user", type = User.class)
})
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
user service 代码:
package com.mvc.service;
import com.mvc.domain.User;
/**
* @Project: spring_mvc_test
*
*
* @Date:2011-9-5
*
*/
public interface UserService {
public void addUser(User user);
public User findUser(int id);
}
user service impl 代码:
package com.mvc.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mvc.dao.UserDAO;
import com.mvc.domain.User;
/**
* @Project: spring_mvc_test
*
* @Annotation: userservice 实现类
* 使用@Service标注service
*
* @Date:2011-9-5
*
*/
@Service
public class UserServiceImpl implements UserService {
//@Resource(type=com.mvc.dao.UserDAOImpl.class)
@Autowired
private UserDAO userDAOImpl;
@Override
public void addUser(User user) {
System.out.println("调用userservice的addUser方法");
userDAOImpl.addUser(new User());
}
@Override
public User findUser(int id) {
System.out.println("调用userservice的findUser方法");
userDAOImpl.findUser(111);
return null;
}
}