很明显,SimpleFormController是处理表单提交比较好的一种控制器。下面就一个小例子对SimpleFormController的用法做一个总结。
首先提纲挈领,我们的例子是做一个新闻提交模块。
如下图所示:
在输入http://localhost:8080/javalearn1.0/addNews.html后,即打开此页面,从数据库中读出新闻类别并在select框中显示。而用户填完新闻标题和新闻内容后,即保存至数据库,并刷新页面,在提交新闻按钮下方显示:保存数据成功。
第一步的显示对应一个ShowNewsClassController,而第二步保存对应AddNewsController。
首先是javalearn-servlet.xml的配置:
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/addNews.html">showNewsClassController</prop>
<prop key="/addNews1.html">addNewsController</prop>
</props>
</property>
</bean>
对应的ShowNewsClassController为:
package com.javalearn.control;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import com.javalearn.service.*;
import java.util.*;
import com.javalearn.model.*;
public class ShowNewsClassController extends AbstractController{
private JavalearnService javalearnService;
public JavalearnService getJavalearnService() {
return javalearnService;
}
public void setJavalearnService(JavalearnService javalearnService) {
this.javalearnService = javalearnService;
}
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
// TODO Auto-generated method stub
List<Tbclass> list=this.javalearnService.readNewsClass();
Map<String,List<Tbclass>> map=new HashMap<String,List<Tbclass>>();
map.put("myclass",list);
return new ModelAndView("addNews","map",map);
}
}
这个类就是在页面加载时,读取新闻类别并进行显示。
对应的addNews.jsp页面为:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>欢迎访问Javalearn JAVA学习网</title>
</head>
<body>
<form action="addNews1.html" method="post">
<p>新闻类别:
<select name="myclass">
<c:forEach items="${map.myclass}" var="Parameter">
<option value="${Parameter.id}">${Parameter.classname }</option>
</c:forEach>
</select></p>
<p>新闻标题:<input name="title" type="text"/></p>
<p>新闻内容:<textarea name="mycontent" rows="10" cols="100"></textarea></p>
<p><input type="submit" value="提交新闻"/></p>
</form>
<font color="red">${map.message}</font>
</body>
</html>
即,点击了提交按钮后,跳转至addNews1.html。而由在javalearn-servlet.xml中配置可知,此url交由AddNewsController进行处理。AddNewsController继承至SimpleFormController,onSubmit方法处理提交事件。且form中的各个控件的name对应AddNewsController的CommandClass的属性。类似于Struts2或JavaBean的用法。
package com.javalearn.control;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import com.javalearn.model.Tbclass;
import com.javalearn.model.Tbnews;
import com.javalearn.service.*;
import java.util.*;
/*
* author:Tammy Pi
* function:添加新闻的Controller
*/
public class AddNewsController extends SimpleFormController{
private JavalearnService javalearnService;
public AddNewsController()
{
this.setCommandClass(Tbnews.class);
this.setCommandName("Tbnews");
}
public JavalearnService getJavalearnService() {
return javalearnService;
}
public void setJavalearnService(JavalearnService javalearnService) {
this.javalearnService = javalearnService;
}
protected ModelAndView onSubmit(Object command,BindException bindException) throws Exception
{
Tbnews tbnews=(Tbnews) command;
Map map=new HashMap<String,String>();
List<Tbclass> list=this.javalearnService.readNewsClass();
if(this.javalearnService.saveNews(tbnews))
{
map.put("message","保存数据成功!");
}
else
{
map.put("message","保存数据失败!");
}
map.put("myclass",list);
return new ModelAndView(this.getSuccessView(),"map",map);
}
}