spring mvc 解析

本文介绍了一个基于Spring MVC的实际应用案例,包括项目配置、控制器编写、数据绑定等关键环节,并展示了如何利用Spring MVC处理Web请求。

项目地址: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)

 

                 spring mvc结构图(来自官网)

 

 

由于不在本文讨论范畴,为了方便起见,笔者仅对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;
	}

}
 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值