欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简述spring3 mvc核心

程序员文章站 2022-07-08 10:24:16
...

疯狂的周末过后,今天拖着疲惫的身体。没有工作状态,于是总结几点spring3 mvc 的核心内容吧!包括不解之处能与大家讨论讨论!

虽然struts2功能强大,使得javaweb开发更加条理有序,代码整洁美观,方便维护。但是struts2的执行效率相对较低,学习难度也相对spring mvc偏高,复杂!个人认为常规的web开发spring mvc足已!下面简单总结总结:

一、在struts2中相信大家对ModelDriven<T>(数据模型驱动)不陌生吧!那么在spring3 mvc中也提供了相似的功能(我不解的是看到身边的同事居然在用request取form的值,代码复杂!!我个人不喜欢,看着头痛!)    --数据模型(将表单数据直接封装成entity)只需要将请求方法定义为带entity的参数方法,在jsp中input的name属性和entity属性名一致(不知还有其他方式?求分享!)


public Map<String, Object> deleteStudent(@ModelAttribute Student student){
 
 studentbiz.delete(student.getStudentId());
 
 return null;    //伪代码,主要看结构
 }
二、json数据,首先在springmvc-config.xml中配置(别忘记添加jackson-core-asl-1.9.2.jar,jackson-mapper-asl-1.9.2.jar)


<!-- json支持 -->
	 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		 <property name="messageConverters">
			  <list>
			   		<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
			  </list>
		 </property>
	</bean>
实现请求方法(添加@ResponseBody即可)


       @RequestMapping(value="deleteStudent")
	@ResponseBody
	public Map<String, Object> deleteStudent(@ModelAttribute Student student){
		Map<String,Object> data = new HashMap<String, Object>();
		try {
			studentbiz.delete(student.getStudentId());
			data.put("flag", true);
			data.put("msg", "删除成功!");
		} catch (Exception e) {
			data.put("flag", false);
			data.put("msg", "删除失败!");
		}
		return data;
	}
三、数据校验(这个头痛,望高手指点一二)


先定义验证器:

package com.test.web.validators;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import com.test.bean.User;

/**
 * 用户验证器
 * @author Administrator
 *
 */
public class UserValidator implements Validator{

	@Override
	public boolean supports(Class<?> zlass) {
		return User.class.isAssignableFrom(zlass);
	}

	@Override
	public void validate(Object object, Errors errors) {
		User user = (User)object;
		ValidationUtils.rejectIfEmpty(errors,"userName", "required", "用户名不能为空!");
		ValidationUtils.rejectIfEmpty(errors,"password", "required", "密码不能为空!");
		int len = user.getUserName().length();
		if (len>0) {
			if (len<2 || len>20) {
				errors.rejectValue("userName","user.userName.too_long","用户名在2-20个字符!");
			}
		}
		len = user.getPassword().length();
		if (len>0) {
			if (len<6 || len>10) {
				errors.rejectValue("password","user.password.too_long","密码在2-20个字符!");
			}
		}
	}
}
在Controller中引用


package com.test.web.controller;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.test.bean.User;
import com.test.web.validators.UserValidator;


@Controller
// 改注解可以省略,可以表示访问的包名吧
@RequestMapping("/user")
public class UserController{
	
	// 初始化绑定了一个自定义验证器,后续做介绍,忽略。。。
	@InitBinder
	protected void initBinder(WebDataBinder binder){
		binder.setValidator(new UserValidator());
	}
	// 请求映射,value和表单的action一致,mothod表明表单的提交方式 @Validated指定了user对象需要验证
	 @RequestMapping(value="hello",method=RequestMethod.POST)
	 public ModelAndView helloWorld(@Validated User user,BindingResult result,Model model) {
		 if (result.hasErrors()) {
			 // 回填表单信息,不至于用户请求失败后,数据清空
			model.addAttribute("user", user);
			// 请求结果跳转的视图名称
			return new ModelAndView("hello");
		}
		 return new ModelAndView("sucess", "user", user);
	 }
	 // 注意@ModelAttribute类似struts2中的模型驱动接口(将请求的表单直接封装成User对象了)
	 @RequestMapping(value="index")
	 public ModelAndView index(@ModelAttribute User user){
		 return new ModelAndView("hello").addObject(user); 
	 }
}


这样虽然可以实现按指定规格校验数据,但是如果我有n个请求需要校验是不是要写n个Validator实现类呢,太麻烦了,求高手指点!

四、拦截器

xml配置

<!-- 拦截器配置 -->
	<mvc:interceptors> 
       <mvc:interceptor> 
           <mvc:mapping path="/**" /> <!-- 拦截所有请求 -->
           <!-- 添加自定义拦截器 -->
           <bean class="com.manage.web.interceptor.SystemInterceptor" /> 
       </mvc:interceptor> 
    </mvc:interceptors>
实现拦截器

package com.manage.web.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.manage.bean.User;
import com.manage.web.utils.Constant;

public class SystemInterceptor implements HandlerInterceptor{

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		User user = (User) request.getSession().getAttribute(Constant.CURRENT_USER);
		
		PathMatcher matcher = new AntPathMatcher();
		// 获取请求路径
		String requestURL = request.getRequestURL().toString();
		String patternPath="**/login.do";//路径匹配模式
	    boolean result =matcher.match(patternPath, requestURL);
	    
	    if(result){
	    	return true;
	    }
		if (user==null) {
			response.sendRedirect(request.getContextPath()+"/login.jsp");
			return false;
		}
		return true;
	}

	@Override
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
		
	}
}
以上是简单的总结,不解之处望大牛们指点一二,不胜感激!!!









转载于:https://my.oschina.net/xiaoen/blog/127957