今天在网上看到有很多SpringMVC的例子,写的都不是很详细,于是找到官方的文档看了又看,鼓捣了一下午终于完成了一个小例子,由于本人也是刚开始接触SpringMVC,也有很多不懂的地方,如果写的不好,请大家不要骂。
1.首先把需要的类库导入,整个的结构大概是这样的:
在网上看了好多文章,都说把JSP放在WEB-INF下面是个不错的办法,防止有些淘气的人捣乱。
2.建立applicationContext.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:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 属性配置 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/config/jdbc.properties" />
<!--数据源-->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
p:username="${jdbc.username}" p:password="${jdbc.password}" />
</beans>
当然这里没有用到数据源,可以不去管它。
3.接下来修改web.xml文件,代码如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>CMS</display-name>
<welcome-file-list>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-
Servlet定义
这里我们定义了请求分发Servlet,即:
org.springframework.web.servlet.DispatcherServlet
DispatcherServlet 是Spring MVC 中负责请求调度的核心引擎,所有的请求将
由此Servlet 根据配置分发至各个逻辑处理单元。其内部同时也维护了一个
ApplicationContext实例。
-à
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<!-
请求映射
我们将所有以.htm结尾的请求交给Spring MVC进行处理。当然,也可以设为其他值,
如.action、.action等。当然用.htm的后缀是不推荐的。在tomcat上会出问题。
-à
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
</web-app>
4.然后创建dispatcher-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:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
<!-- 分发器 -->
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="index.htm">indexController</prop>
<prop key="test.htm">testController</prop>
</props>
</property>
</bean>
<!-- 指定了表现层资源的前缀和后缀 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
<!--请求/处理单元关系映射-->
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />
<bean name="testController" class="com.zhkj.cms.controller.TestController"
p:commandClass="com.zhkj.cms.controller.TestFrom"
p:fail_view="fail"
p:success_view="success" />
</beans>
通过以上设定,Web 服务器将把登录界面提交的请求转交给Dispatcher 处理,
Dispatcher将提取请求(HttpServletRequest)中的输入数据,分发给对应的处理单元,
各单元处理完毕后,将输出页面返回给Web服务器,再由Web服务器返回给用户浏览器。
Dispatcher 根据什么分发这些请求?显然,我们还需要一个配置文件加以设定。这也就
是上面提及的dispatcher-servlet.xml,此文件包含了所有的“请求/处理单元”关系映射设定,以及返回
时表现层的一些属性设置。
5.接下来写一个pojo,也就是form类,名字为TestFrom。代码如下
public class TestFrom {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
6.然后编写TestController.java代码如下:
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
public class TestController extends SimpleFormController{
private String fail_view = null;
private String success_view = null;
@Override
protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
TestFrom ts = (TestFrom)command;
if (ts.getName().equals("ly") && ts.getPwd().equals("123")){
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("TestFrom", ts);
List<String> msgList = new LinkedList<String>();
msgList.add("这是什么?");
msgList.add("hello world");
msgList.add("你好,Spring MVC");
map.put("msg", msgList);
return new ModelAndView(this.getSuccess_view(),map);
}else{
return new ModelAndView(this.getFail_view());
}
}
public String getFail_view() {
return fail_view;
}
public void setFail_view(String fail_view) {
this.fail_view = fail_view;
}
public String getSuccess_view() {
return success_view;
}
public void setSuccess_view(String success_view) {
this.success_view = success_view;
}
}
可以看到,类似Servlet的doGet/doPost方法,此版本的onSubmit方法签名中
包含了Servlet规范中的HttpServletRequest、HttpServletResponse以提
供与Web服务器的交互功能(如Session的访问)。此参数类型的onSubmit方法
的调用优先级较高。也就是说,如果我们在子类中同时覆盖了这两个不同参数的onSubmit方法,那么只有此版本的方法被执行,另一个将被忽略。
然后将输入的请求数据对象强制转型为预定义的请求对象类型。
返回处理结果
ModelAndView类包含了逻辑单元返回的结果数据集和表现层信息。ModelAndView
本身起到关系保存的作用。它将被传递给Dispatcher,由Dispatcher 根据其中
保存的结果数据集和表现层设定合成最后的界面。
这里我们用到了两种签名版本的ModelAndView构造方法:
Ø public ModelAndView(String viewname)
返回界面无需通过结果数据集进行填充。
Ø public ModelAndView(String viewname, Map model)
返回界面由指定的结果数据集加以填充。可以看到,结果数据集采用了Map接口
实现的数据类型。其中包含了返回结果中的各个数据单元。关于结果数据集在界
面中的填充操作,可参见下面关于返回界面的描述。
上面这两个版本的构造子中,通过viewname指定了表示层资源。
另外,我们也可以通过传递View对象指定表示层资源。
Ø public ModelAndView(View view)
Ø public ModelAndView(View view, Map model)
我们可以结合RedirectView完成转向功能,如:
return new ModelAndView(
new RedirectView(“/redirected.jsp”
));
当然,我们也可以在带有HttpServletRequest参数的onSubmit方法实现中,通
过HttpServletRequest/HttpServletResponse完成forward/redirect功
能,这两种途径可以达到同样的效果。
7.接下来写index.jsp代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="include.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getLocalAddr() %>
<form action="test.htm" method="post">
name:<input type="text" name="name"/><br>
pwd:<input type="text" name="pwd"/><br>
<input type="submit">
</form>
</body>
</html>
8.编写fail.jsp这个页面是如果登录失败才会跳转到这里
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
登陆失败<a href="index.htm">点此</a>返回
</body>
</html>
9.编写success.jsp文件,如果登录成功,跳转到这个页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="include.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
登陆成功!!!!!!!!!!<br>
<c:out value="${TestFrom.name}"></c:out><br>
<c:forEach items="${msg}" var="item">
${item}<br>
</c:forEach>
</body>
</html>
如果各位按照上面的代码多试试,就会成功了。