现在介绍SSH的文章很多,但是适合自己需求的却经常找不到,这些东西呢,会了之后总会感觉别人的程序哪里哪里别扭,会之前呢就感觉很混乱,而且SSH的官方文档,至少在我看来是“会者勉强能看、不会者一片迷茫”的,最主要的是没有什么demo,也可能因为我太low了,高手勿喷,我的感觉就是根据文档呢很容易明白如果写了A就能怎么样写了B又能怎么样,但是这个A或者B到底写在哪能让程序跑起来呢,更是会者不难、难者不会。我隔了两年没有做这方面的项目,最近重新拾起来,不再用struts,用spring、spring mvc、hibernate、spring security、spring oauth2搭建网站,这篇包括下面几篇文章,我会简述我搭建最基本环境的过程并给出demo,然后再详细地讲一些配置。

在各个文章我会分别介绍,每篇都附有example,可以根据情况进行修改:

springmvc(本文)

springmvc+spring

springmvc+spring+hibernate

springmvc+spring+hibernate+spring security

springmvc+spring+hibernate+spring security+spring oauth2

这篇文章就来介绍springmvc环境的搭建。

1. pom.xml

首先来看都需要加入哪些包,我使用maven来管理包的依赖。

<properties>
<spring.version>4.0.4.RELEASE</spring.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>tomcat</groupId>
<artifactId>servlet-api</artifactId>
<version>5.5.23</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>tomcat</groupId>
<artifactId>jsp-api</artifactId>
<version>5.5.23</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.2.Final</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
</dependencies>

核心的包就是spring-webmvc,这个包导入之后会自动导入spring-core,spring-web等它的依赖包;

后面jstl、taglibs等包的导入是为了在jsp页面中使用jstl等标签;

commons-fileupload是为了文件上传的需要,本demo中没有上传文件的部分,不过哪个网站能没有上传图片呢?

hibernate-validator的导入是为了正常使用springmvc的valid,springmvc的valid只有接口没有实现,如果要使用它的功能需要导入一个实现包,导入hibernate-validator就是为了这个目的,本文的demo里面没有用到validation,所以只是为了运行基本demo,这个可以不导入;

jackson-mapper的导入是为了使用springmvc返回json的功能,对于这个功能springmvc也是只有接口没有实现,如果不导入实现包,要返回json时会返回406错误。jackson-core包会作为依赖导入。

2. web.xml

springmvc和struts的一个机制上的区别就是,struts是一层一层的拦截器在过滤,springmvc是只有一个核心的Servlet,所以首先按照正常注册Servlet的方法,在web.xml中注册这个springmvc:

<?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_3_0.xsd"
metadata-complete="true" version="3.0"> <servlet>
<servlet-name>spring-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>spring-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> </web-app>

springmvc还要做很多配置,那些配置在单独的配置文件里,这个配置文件的默认位置就是在web.xml相同目录下的<servlet-name>-servlet.xml,比如我的servlet-name配置的是spring-dispatcher,那么我的springmvc配置文件的默认位置就是web.xml同目录下的spring-dispatcher-servlet.xml。

3. spring-dispatcher-servlet.xml

下一步就是配置springmvc,编辑WEB-INF/spring-dispatcher-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <context:component-scan base-package="org.zhangfc.demo4springmvc.mvc"/> <mvc:annotation-driven /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
</bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="2000000"/>
</bean> <mvc:resources mapping="/static/**" location="/resources/"/> <mvc:default-servlet-handler /> </beans>

Springmvc的虚拟路径与处理函数的映射,是通过annotation来设置的,这些类都在哪个包下面,就是那个component-scan属性配置的,并设置支持annotation支持,springmvc的每一个处理函数都会返回一个String类型的变量(有的函数返回值就是String,有的返回值是一个对象,对象里有一个viewResolver需要的字符串),我这个设置就是设置一个前缀和后缀,举个例子来说,对于函数返回的这个String,比如是abc,那么需要渲染的文件就是/pages/abc.jsp。

multipartResolver是上传文件需要的配置,还是那句话,本demo中用不到,不过还是写上,哪个项目里不需要上传点东西呢。

最后一个属性,是对静态资源的映射,经过这个映射之后,要访问/static/a.png时,实际访问的就是/resources/a.png。

4. HomeController.java

下面来写一个控制器,位置在上面component-scan配置的package下,springmvc用RequestMapping的annotation来指定虚拟路径,把类这一级的和方法级的加在一起就是最终的虚拟路径,看这段代码:

@Controller
@RequestMapping("/")
public class HomeController {
@RequestMapping("")
public String home(){
return "index";
} @RequestMapping("/json")
@ResponseBody
public Map<String, String> json(){
Map<String, String> result = new HashMap<String, String>();
result.put("zhangsan", "hello");
result.put("lisi", "world");
result.put("wangwu", "nihao");
return result;
}
}

这儿类这个级别的RequestMapping的值是"/",home这个方法级别的呢值是空,两个加起来就是"/",而json这个方法的RequestMapping是"/json",所以,当访问的URL是"/"的时候,会调用home这个方法来处理,返回值是一个字符串index,还记得前面的viewResolver吗,根据那个配置,这个方法执行完成之后会渲染/pages/index.jsp,所以在WEB-INF的同级目录下创建pages目录(也就是WEB-INF的兄弟目录),再创建index.jsp,运行整个工程,访问"http://localhost:8080/demo4springmvc/"得到的就是index.jsp,因为json方法有一个@ResponseBody的annotation,它的返回值直接给客户端,所以访问"http://localhost:8080/demo4springmvc/json"得到的就是json串:

{"lisi":"world","zhangsan":"hello","wangwu":"nihao"}

源码下载

这是springmvc的最基本的demo,详细的用法,我会各个框架整合在一起之后再写。

最新文章

  1. 前端学HTTP之基本认证
  2. jQuery-1.9.1源码分析系列(十六)ajax——jsonp原理
  3. oracle问题
  4. CRM 启用或禁用自定义代码执行
  5. 【干货分享】Node.js 中文资料导航
  6. kettle初探
  7. JSBinding + SharpKit / 初体验:下载代码及运行Demo
  8. Alpha、 Beta、build、release测试
  9. MyEclipse 从数据库反向生成Hibernate实体类
  10. 同时安装VS2010,VS2012
  11. Oracle的三种高可用集群方案
  12. 用javascirpt画个太极
  13. 什么时候需要使用Double? double、float、decimal的区别
  14. sql 经典面试题
  15. CSS中的一下小技巧2之CSS3动画勾选运用
  16. select 使其默认选中文本不为空
  17. ISE初始化
  18. docker往阿里云推镜像和打包镜像
  19. The Little Prince-12/16
  20. Reading table information for completion of table and column names

热门文章

  1. rs485
  2. 命令行解析函数:getopt/getopt_long
  3. C# 委托、事件,lamda表达式
  4. MySql中LongText字段对应Hibernate映射文件的设置(转)
  5. Shell--变量内容的删除、替代与替换
  6. 关于container_of和list_for_each_entry 及其相关函数的分析
  7. ASP.NET MVC4网站部署在阿里ECS云服务器(WIndows Server 2012+IIS8环境)
  8. 搭建Drupal-8.5.3
  9. 【共享单车】—— React后台管理系统开发手记:UI菜单各个组件使用(Andt UI组件)
  10. kibana显示elasticsearch集群中flume到入的日志