练习项目:test
SpringMVC 实例 --非注解,只用于学习理解。到了spring 3.0以后或许部分东西已经过时了,在实际工作中并不一定好用。
但对于理解SpringMVC的实现方式很有帮助,在以后使用注解时,会明白是怎么个来龙去脉!
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">
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
">
package test;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Emp {
private int id;
private String name;
private String phone;
private Date hireDate;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
@Override
public String toString() {
return id+","+name+","+phone+","+new SimpleDateFormat("yyyy-MM-dd").format(hireDate);
}
}
package test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class StartController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println("成功了!");
return new ModelAndView("start"); //视图的逻辑名称,具体用jsp、framemark还是其他比不知道,也不需要知道。 模块解耦分离。
}
}
package test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class EmpController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//逐个获取表单参数,当参数很多时就会变的麻烦。如果我们可以 直接以一个对象的形式获取就方便的多了。
//不用担心EmpController2控制器实现了这个功能。
String name = request.getParameter("name");
String phone = request.getParameter("phone");
Emp emp = new Emp();
emp.setName(name);
emp.setPhone(phone);
//service.addEmp(emp); //一般是这样用的
System.out.println(emp);
return null;
}
}
控制器EmpController2--以对象形式封装表单参数:
package test;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;
/**
* 当我每添加一个控制器,就会在test-servlet.xml配置一个bean和添加一个路径的映射。
* 这样会很麻烦。
*
* 视图解析器只需要配置一个就可以了。
* @author Administrator
*
*/
public class EmpController2 extends AbstractCommandController {
/**
* Spring 3.0 已经将AbstractCommandController类标注为过期了,她提倡我们使用注解。
* 我们这里只是帮助大家理解如何将表单参数自动封装为command(是一个Object类型的对象)对象的。
*
* 将表单参数自动封装到command对象中。但是需要在test-servlet.xml里配置command的类型。
* BindException绑定异常,表单中的参数,在赋给对象Emp是需要类型转换。当转换出错是异常信息就会在这里。
*
* 与SimpleFormController的区别在于,method为post时onSubmit才会提交。
*/
@Override
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object command, BindException bindException)
throws Exception {
Emp emp = (Emp)command;
System.out.println(emp.getHireDate());
System.out.println(emp);
//return "success"; //当我们不返回模型视图是我们也可以直接返回一个String字符串,这个字符串表示视图名。
return new ModelAndView("success");//返回逻辑视图名,在test-servlet.xml里会得到 从逻辑视图到真正视图的映射。
}
public Map xxx(HttpServletRequest request, HttpServletResponse response){
//基于惯例的处理模式,当没有指定视图名称 默认根据请求路径来返回响应的视图名有些类似于UrlFilenameViewController。
return null;
}
//注册时间编辑器
@Override
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws Exception {
//binder.registerCustomEditor(Date.class, new MyDateProperty()); //完全自己定义编辑器。 MyDateProperty为我们自己实现的时间编辑器。
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true)); //自定义编辑器(spring提供的一个半成品编辑器)。
//super.initBinder(request, binder);
}
}
package test;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
public class EmpFormController extends SimpleFormController {
/**
* 与AbstractCommandController的区别在于FormController 当 method为post时onSubmit才会提交。
*/
@Override
protected ModelAndView onSubmit(Object command) throws Exception {
// TODO Auto-generated method stub
Emp emp = (Emp)command;
System.out.println(emp);
//return super.onSubmit(command);
return new ModelAndView("success");
}
}
package test;
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
/**
* 属性编辑器 - 将文本转换为xxx对象或将对象转换成文本。
* @author Administrator
*/
public class MyDateProperty extends PropertyEditorSupport {
@Override
public String getAsText() {
return super.getAsText();
}
@Override
public void setAsText(String arg0) throws IllegalArgumentException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
format.parse(arg0);
} catch (ParseException e) {
e.printStackTrace();
}
//super.setAsText(arg0);
}
@Override
public void setValue(Object arg0) {
super.setValue(arg0);
}
}
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>