最近闲暇之余,感觉很久没有写博客了, 以前都是写一些算法, 今天打算写一下SpringMvc. 总的来说Mvc也算是一种设计模式, 不仅仅是Java, 前端js, 数据库。 也可以采用这种模式来达到一个业务逻辑和页面显示通过控制器达到解耦的目的。 SpringMvc可以跟SpringIOC无缝对接, 比起struts2也有好的几点如下:
第一:struts2 性能较低, 基本上在我的机子上跑速度比较慢, 主要我想是他自带的标签库,UI库。 在前端如此丰富的今天完全没有必要用struts2自带的标签库了。
第二: SpringMvc是基于方法级切入的,struts是基于类切入的。相对于而言,Spring粒度更细。
第三:struts2的入口是filter, 而Springmvc是servlet.
第四:Spring所提供SpringSecurity这个权限框架也很不错。 当然我并没有在struts2上做过多个深入, 估计也有这种框架。
首先我假定你已经对Spring这个框架有一定的了解,但是没有也没关系。
首先我们介绍的是SpringMvc的核心。 DispatcherServlet, 这个Servlet充当SpringMvc的前端控制器主要用作职责调度工作 ,也就是一个流程的控制。他得在web.xml中进行配置。
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1<load-on-startup>
<servlet>
其中servlet-name 这个属性蛮重要,在默认的情况下,DispatcherServlet会加载从一个基于这个Servlet名字的xml文件中
加载Spring应用的上下文。 比如上面的例子, DispatcherServlet会加载xxx-servlet这个文件,这个xml文件一般是写在你的
Tomcat的WEB-INF目录下面。
接着我们必须声明DispatcherServlet要处理的URL(*,htm /* /app)等等, 这个也是写在你的web,xml中的, 如:
<servlet-mapping>url-pattern 就是你要处理的URL, 我这里加上 "/" 意思是处理所有的URL。 (你也可以在Spring中配置<mvc:resources>这个元素)
<servlet-name>zd_web</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
接着我们可以指定DispatcherServlet将请求发送给哪个控制器。 所有的请求都要通过DispatcherServlet,然后再由它进行分发, 一般我们将请求发送到HanderMapping上面,那什么是HanderMapping呢,HanderMapping的就是为每个请求找到合适的处理器handler. 那什么是handler呢, 通俗点讲就是标注了@RequestMapping的方法。
那么我们怎么确定控制器呢, 在通俗点讲就是在类上面标注@Controller注解进行装饰的class。 这个我在网络上找了一张图:
首先,当前端的请求到达的时候, 我们根据我们所编写的请求类进行处理, 这个类必须打上@controller这个注解,以表示它是一个控制器类, 接着我们可以在这个类的方法
里面打上@RequestMapping对请求进行装饰。
好的,首先我们先不管那么多概念, 心中得有一个流程的模型, 俗话说,代码能跑起来在想优化的事情。 那么知道这几个概念后,我们可以开始跑一跑这个小项目了,
首先定义一个表单类, 他用javaScript进行GET方式的提交:
我们把这个jsp页面的名字叫做logins.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>Add User</title>
<script type="text/javascript">
//添加用户
function addUser() {
var form = document.forms[0];
form.action = "${pageContext.request.contextPath}/logins";
form.method = "get";
form.submit();
}
</script>
</head>
<body>
<form>
<table>
<tr>
<td>账号</td>
<td>
<input type="text" name="userName">
</td>
</tr>
<tr>
<td>密码</td>
<td>
<input type="password" name="password">
</td>
</tr>
<tr>
<td> </td>
<td>
<input type="button" value="提交" onclick="addUser()">
</td>
</tr>
</table>
</form>
</body>
</html>
接着我们在写控制器 定义一个包名字为login, 因为我上面通过JS的from.submit()提交了表单。 这个控制器类的名字叫LoginContller
package login;其中path 是URI名称, 也就是你输入地址 http://locathost:"加上你的项目名"/logins/
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class LoginController {
@RequestMapping(path="/logins",method=RequestMethod.GET)
public String login(LoginBean loginBean) {
System.out.println(loginBean.getuserName());
System.out.println(loginBean.getPassword());
return "logins";
}
}
接着我们在写一个Bean,接受请求的参数,UserName和PassWrod,他的名字是loginBean
package login;其中Size和Length是JSR的数据效验,这个大家可以忽略或者去掉。
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Length;
public class LoginBean {
private String userName;
private String Password;
public String getuserName() {
return userName;
}
public void setuserName(@Size(min=4,max=15,message="账号要满足4-15个字符")String userName) {
this.userName = userName;
}
public String getPassword() {
return Password;
}
public void setPassword(@Length(min=6,max=15,message="密码要满足6-15个字符")String password) {
Password = password;
}
}
接着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" 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>zd_web</display-name>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
<welcome-file>login.jsp</welcome-file>
<welcome-file>login.jsp</welcome-file>
<welcome-file>login.jsp</welcome-file>
<welcome-file>login.jsp</welcome-file>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<!--
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
-->
<servlet>
<servlet-name>zd_web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/zd_web-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>zd_web</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
其中zd_web是我在写的一个Erp名字叫zd_web 这个大家可以换做你自己的项目名。或者也写成这样。(需要注释掉listener如果知道IOC的应该想得到,没学的可以直接注释)
接着是Spring的配置文件, 名字为:zd_web-servlet(同上zd_web名字可以改成你的项目名):
context:component-scan base-package="login"/>
<!-- <context:component-scan base-package="login_Verify_picture"/> -->
<!-- 启用spring mvc 注解 -->
<context:annotation-config />
<mvc:default-servlet-handler />
<!-- 完成请求和POJO映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
其中 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdaper 就是我们的视图控制器了, 他通过
<property name="prefix" value=提供你具体的返回视图, 在哪里返回呢? 看上面的打上了@Controller的类中打上了@RequestMapping的那个方法, 他的return, 他return的就是具体的视图, 我们通过
在配置文件中配置视图的位置, 前缀比如说这个视图在WEB-INF目录下的jsp目录下, 后缀就是他以.jsp页面结尾的后缀。 当然视图还有多种方法, 这里我给出的是最简单暴力的方法。
那么整个入门项目貌似就完成了,下面我给出在我机子上面的运行截图:
最近很忙,所以写的很不好, 望各位多加指正, 关于Spring的其他(对REST的支持,权限框架, 事务管理, IOC容器)。 我会等有空后跟大家分享。对于书籍,
Spring in action 和Spring3.0x企业实战 这2本书我觉得很好呢。 嘿嘿