搞spring mvc基础教程需要什么基础

Java Web系列:Spring MVC基础 - ImportNew
| 标签: ,
1.Web MVC基础
MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来。就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法。框架只能在技术层面上给我们帮助,无法在思考和过程上帮助我们,而我们很多人都不喜欢思考和尝试。
2.实现Web MVC的基础
实现Web MVC基础可以概括为1个前段控制器和2个映射。
(1)前端控制器FrontController
ASP.NET和JSP都是以Page路径和URL一一对应,Web MVC要通过URL映射Controller和View,就需要一个前端控制器统一接收和解析请求,再根据的URL将请求分发到Controller。由于ASP.NET和Java分别以IHttpHandler和Servlet作为核心,因此ASP.NET MVC和Spring MVC分别使用实现了对应接口的MvcHandler和DispatcherServlet作为前段控制器。
ASP.NET中通过HttpModule的实现类处理URL映射,UrlRoutingModule根据URL将请求转发给前端控制器MvcHandler。Spring MVC中,则根据URL的配置,直接将请求转发给前端控制器DispatcherServlet。
(2)URL和Contrller的映射
ASP.NET MVC将URL和Controller的映射规则存储在RouteCollection中,前端控制器MvcHandler通过IController接口查找控制器。Spring MVC则通过RequestMapping和Controller注解标识映射规则,无需通过接口依赖实现控制i器。
(3)URL和View的映射
ASP.NET MVC 默认通过RazorViewEngine来根据URL和视图名称查找视图,核心接口是IViewEngine。Spring MVC 通过internalResourceViewResolver根据URL和视图名称查找视图,核心接口是ViewResolver。
3.Spring MVC的基础配置
(1)前端控制器DispatcherServlet初始化:AbstractAnnotationConfigDispatcherServletInitializer
ASP.NET MVC初始化需要我们在HttpApplication.Application_Start方法中注册默认的URL和Controller规则,Spring MVC由于采用注解映射URL和Controller,因此没有对应的步骤。ASP.NET在根web.config中配置了UrlRoutingModule可以将请求转发给MvcHandler,Spring MVC我们需要我们配置DispatcherServlet以及其对应的URL来达到接管所有请求的目的,Spring已经利用Servlet3.0定义的ServletContainerInitializer机制,为我们提供了内置的AbstractAnnotationConfigDispatcherServletInitializer,只要只需要像继承HttpApplication的MvcApplication一样,写一个MvcInitializer。
package s4s;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletI
public class MvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class&?&[] getRootConfigClasses() {
return new Class[] { };
protected Class&?&[] getServletConfigClasses() {
return new Class[] { MvcConfig.class };
protected String[] getServletMappings() {
return new String[] { &/& };
(2)URL和View的映射:WebMvcConfigurerAdapter
ASP.NET的RazorViewEngine内置了View的Path和扩展名.cshtml的规则。Spring MVC的internalResourceViewResolver没有提供默认值,一般我们会指定将View放置在统一的视图目录中,使用特定的扩展名。Spring同样提供了内置的WebMvcConfigurerAdapter,我们只需写一个自己的MvcConfig继承它,重写configureViewResolvers方法即可。
package s4s;
import org.springframework.ponentS
import org.springframework.context.annotation.C
import org.springframework.web.servlet.config.annotation.EnableWebM
import org.springframework.web.servlet.config.annotation.ViewResolverR
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerA
import org.springframework.web.servlet.view.InternalResourceViewR
@EnableWebMvc
@ComponentScan
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix(&/WEB-INF/views/&);
viewResolver.setSuffix(&.jsp&);
registry.viewResolver(viewResolver);
4.Spring MVC的Controller、Model和View
(1)URL和Controller的映射:
Spring MVC和ASP.NET MVC的不同,不通过IController接口标识Controller,也不通过RouteCollection定义URL和Controller,取而代之的是两个注解:Controller和RequestMapping。因此我们在普通的POJO类上应用@Controller和@RequestMapping即可。
package s4s;
import javax.validation.V
import org.springframework.security.access.prepost.PreA
import org.springframework.security.core.context.SecurityContextH
import org.springframework.stereotype.C
import org.springframework.validation.BindingR
import org.springframework.web.bind.annotation.ModelA
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestP
import org.springframework.web.bind.annotation.ResponseB
@Controller
public class MyController {
@ResponseBody
@RequestMapping(value = &/&)
public String home() {
return &home&;
@RequestMapping(value = &/register&)
public String register(@ModelAttribute(&model&) RegisterUserModel model) {
return &register&;
@RequestMapping(value = &/register&, method = RequestMethod.POST)
public String register(@ModelAttribute(&model&) @Valid RegisterUserModel model, BindingResult result) {
if (!result.hasErrors()) {
return &redirect:/account&;
return &register&;
(2)Model:
通过使用@ModelAttribute、@Valid和BindingResult参数,我们可以指定Model的Name是否参与验证并获取验证结果。为在Model上使用注解验证,还需要引入validation-api和hibernate-validator。
ASP.NET将视图最终编译为WebViewPage&object&,View和Model是一一对应并且类型匹配的,Model可以是任意的POCO。Spring MVC中View和Model是一对多的,提供了ModelMap和其子类ModelAndView提供类似ASP.NET MVC中ViewResult的功能。ModelMap的基类是LinkedHashMap&String, Object&。
Spring MVC中没有ViewResult类型。在Spring MVC中,我们一般返回String类型,可以有多种含义:
a.返回View的名称。
b.返回文本:在Action上应用@ResponseBody注解时。
c.返回跳转:以”redirect:”开头时。如:return “redirect:/success”
模型的验证:
(1)在Model字段上使用JSR-303定义的注解(需要引入hibernate validator)。
(2)在Controller的Model参数上应用@ModelAttribute、@Valid
(3)在View中使用&form:errors&标签
Spring MVC需要添加jstl和spring的tag支持才能完成模型相关的操作。由于Spring MVC中的View和ASP.NET MVC中的区别较大,没有办法指定View持有的Model类型也就没有了智能提示和错误检测的优势。
package s4s;
import javax.validation.constraints.NotN
import javax.validation.constraints.S
public class RegisterUserModel {
@Size(max = 20, min = 5)
private String userN
@Size(max = 20, min = 5)
private String confirmP
public String getUserName() {
return userN
public void setUserName(String userName) {
this.userName = userN
public String getPassword() {
public void setPassword(String password) {
this.password =
public String getConfirmPassword() {
return confirmP
public void setConfirmPassword(String confirmPassword) {
this.confirmPassword = confirmP
register.jsp
&%@ page language=&java& pageEncoding=&UTF-8&%&
&%@ taglib uri=&/jsp/jstl/core& prefix=&c&%&
&%@ taglib uri=&http://www.springframework.org/tags& prefix=&s&%&
&%@ taglib uri=&http://www.springframework.org/tags/form& prefix=&form&%&
&!DOCTYPE HTML&
&title&Getting Started: Serving Web Content&/title&
&meta http-equiv=&Content-Type& content=&text/ charset=UTF-8& /&
&h2&Register&/h2&
&form:form modelAttribute=&model&&
&s:bind path=&*&&
&c:if test=&${status.error}&&
&div id=&message& class=&error&&Form has errors&/div&
&form:label path=&userName&&userName&/form:label&
&form:input path=&userName& /&
&form:errors path=&userName& cssClass=&error& /&
&form:label path=&password&&password&/form:label&
&form:password path=&password& /&
&form:errors path=&password& cssClass=&error& /&
&form:label path=&confirmPassword&&confirmPassword&/form:label&
&form:password path=&confirmPassword& /&
&form:errors path=&confirmPassword& cssClass=&error& /&
&input type=&submit& value=&submit&&
&/form:form&
5.Spring MVC的初始化机制
Spring实现了Servlet 3.0规范定义的javax.servlet.ServletContainerInitializer接口并通过javax.servlet.annotation.HandlesTypes注解引用了WebApplicationInitializer接口。因此在Servlet容器初始化时,在当前class path路径下的WebApplicationInitializer实现类的onStartup方法会自动执行(这和ASP.NET的Application_Start作用类似,在系列中的时曾经提到过)。
ASP.NET中我们在Application_Start中初始化依赖注入容器。在Spring MVC中,我们实现WebApplicationInitializer接口同样可以执行依赖注入的初始化。在Web环境中,我们使用的ApplicationContext接口的实现类为基于注解的AnnotationConfigWebApplicationContext(在系列中的中曾经提到过),但我们无需直接实现WebApplicationInitializer并手动初始化AnnotationConfigWebApplicationContext对象,因为Spring已经定义了AbstractAnnotationConfigDispatcherServletInitializer作为WebApplicationInitializer接口的实现类,已经包含了AnnotationConfigWebApplicationContext的初始化。
采用基于Annotation注解时可以通过@Configurateion指定POJO来替代web.xml配置依赖注入。同样,@ComponentScan可以替代web.xml中的扫描配置功能,使用ComponentScan配合Configurateion可以达到0xml配置的方式。上文中提到的Contrller相关的注解,都是启用ComponentScan后才会被扫描生效。
AbstractAnnotationConfigDispatcherServletInitializer类的父类AbstractDispatcherServletInitializer中已经包含DispatcherServlet的初始化。相关类图如下:
5.Spring MVC的Action Filter
.NET MVC提供了众多Filter接口和一个ActionFilterAttribute抽象类作为Filter的基础,其中以实现了IAuthorizationFilter接口的AuthorizeAttribute拦截器最为我们熟知。Spring MVC则提供了基于HandlerInterceptor接口的众多接口、抽象类和实现类,其中也有和.NET MVC类似的权限验证UserRoleAuthorizationInterceptor拦截器。内置的拦截器可以满足大部分需求,为了省事图就画在一张上了,上面是Spring MVC的,下面是.NET MVC的。
(1)MVC实现的要点是前端控制器、URL和Controller的映射、URL和View的映射
(2)MvcHandler和DispatcherServlet
(3)ServletContainerInitializer和HttpApplication.Application_Start
(4)RazorViewEngine和internalResourceViewResolver
(5)IMvcFilter和HandlerInterceptor
目前没有找到类似ASP.NET中的从特性(注解)生成客户端JavaScript验证的方式,如果大家有相关资料分享,提前谢谢大家。
(1)/developerworks/cn/java/j-lo-jsr303/index.html
(2)http://spring./validation.html#validation-binder
(3)/spring-mvc/spring-3-mvc-and-jsr303-valid-example/
随笔里的文章都是干货,都是解决实际问题的,这些问题我在网上找不到更好的解决方法,才会有你看到的这一篇篇随笔,因此如果这篇博客内容对您稍有帮助或略有借鉴,请您推荐它帮助更多的人。如果你有提供实际可行的更好方案,请推荐给我。
都有好处,都有坏处,自己习惯,用着顺手就好。
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2016 ImportNew[入门级]Spring + SpringMVC + Mybatis工程搭建简单教程 - 简书
下载简书移动应用
写了19039字,被3人关注,获得了16个喜欢
[入门级]Spring + SpringMVC + Mybatis工程搭建简单教程
标题里的这些都是什么我就不细说了,点开这篇博客的你至少应该已经知道了一些。最近工作需要,想学点Spring的东西,看了一些网上关于Spring入门的博客,感觉这些博客面向初学者的话还是有不少没有讲清楚的地方,比如至关重要的配置文件的在工程中的路径,还有某些配置项在xml文件中的所处的节点。也许大牛们觉得这些都太基础了没必要全写出来占着篇幅,要留给展示操作过程的ide界面截图。这是很多代码玩家的另外一个问题,过于依赖ide功能,而不去尝试脱离ide完成同样功能的方式,所以为了展示一个操作,不得不放上ide的截图(如果截图暴露了作者还用的是xp这种古董操作系统或者vc6.0这种古董ide,那简直要low穿地壳了)。所以本教程中————虽然内容是入门级的————我采用了一些我认为逼格比较高的方式,首先尽可能的描述清楚每一行代码所处的文件的在工程中的路径,和代码在文件中的位置,当前限于篇幅,我也不可能精确到每个细节,所以我给出了完整工程托管在github上的路径。另外,尽可能脱离ide,构建和部署均采用命令行和修改配置文件的方式。
工程代码托管在
数据库:MySql 5.7
构建工具:apache-maven-3.3.9
容器:apache-tomcat-9.0.0.M4
0x1 还是从最简单的hello world开始
一个最精简的基于SpringMVC的java web工程需要以下几个文件:首先是导入SpringMVC依赖jar包的pom.xml文件
&!-- 省略了头部的名字空间声明 --&
&modelVersion&4.0.0&/modelVersion&
&groupId&SpringMVCStart&/groupId&
&artifactId&SpringMVCStart&/artifactId&
&version&1.0-SNAPSHOT&/version&
&packaging&war&/packaging&
&dependencies&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-webmvc&/artifactId&
&version&4.2.4.RELEASE&/version&
&/dependency&
&/dependencies&
&/project&
packaging项填写war才可以最终将工程打包成war包;依赖管理部分,只要导入spring-webmvc,maven就会自动将其依赖的spring-core、spring-context、spring-bean等等一并包含进来。
然后是作为一个java web工程最重要的web.xml文件
./src/main/webapp/WEB-INF/web.xml
&!-- 省略了头部的名字空间声明 --&
&display-name&SpringMVCStart&/display-name&
&servlet-name&SpringMVCStart&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&SpringMVCStart&/servlet-name&
&url-pattern&/&/url-pattern&
&/servlet-mapping&
&/web-app&
这里定义了一个名为SpringMVCStart的servlet,其接收类为org.springframework.web.servlet.DispatcherServlet,容器启动时加载,然后在servlet-mapping中将这个servlet映射给url/,即所有路径下的请求均由org.springframework.web.servlet.DispatcherServlet这个类进行分发。于是在这里就引入了spring的webmvc框架。
接下来我们就需要spring的webmvc框架的配置文件。
由于我们的servlet名字叫'SpringMVCStart',在默认情况下,springmvc框架会加载WEB-INF/SpringMVCStart-servlet.xml文件作为配置文件。
./src/main/webapp/WEB-INF/SpringMVCStart-servlet.xml
&!-- 省略了头部的名字空间声明 --&
&mvc:annotation-driven/&
&context:component-scan base-package="org.home.knightingal.controller" use-default-filters="false"&
&context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/&
&/context:component-scan&
其中,&mvc:annotation-driven/&意味着开启spring mvc相关的注解,&context:component-scan&...&/context:component-scan&的意思是,扫描org.home.knightingal.controller路径下所有带有org.springframework.stereotype.Controller注解的类,将其作为controller。
那么接下来就是controller类,比如:
./src/main/java/org/home/knightingal/controller/HelloWorldController.java
package org.home.knightingal.
// 省略一堆import
@Controller
@RequestMapping(value="/helloworld")
public class HelloWorldController {
@RequestMapping(value="/index")
@ResponseBody
public String index() {
return "Hello world";
首先是@Controller注解使得spring mvc框架可以扫描到这个类,将其作为一个controller,接下来两个@RequestMapping注解将index方法绑定给url路径/helloworld/index。@ResponseBody表示将返回值直接作为响应的消息体,否则框架会将方法返回的字符串值理解为响应页面的名字。新版的springmvc框架对于将方法的返回值直接作为响应体的场景有了更简便的注解类型,这里还是沿用老办法。
到目前为止一个基于springmvc的java web项目就搭建完成了,虽然我们只有mvc中的c部分。
我假定你已经配置好了jdk和maven的环境变量,接下来我们在cmd或者shell中输入命令
mvn package
maven就会执行打包程序,它会首先去maven中央仓库下载必要的jar包和插件,首次运行这部分过程可能会持续比较长的时间,取决于你和maven中央仓库的连接网速,必要时请自行科学上网。当jar包和插件都下载完毕,它会执行javac去编译java源码,如果有单元测试的话此编译完成后它还会执行单元测试,最后它会将编译后的class文件,以及java web需要的各类配置文件一并打成war包,放入target目录下。
如果一切正常,那么此时你应该可以看到
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.286 s
[INFO] Finished at: T00:20:08+08:00
[INFO] Final Memory: 12M/147M
[INFO] ------------------------------------------------------------------------
类似字样。尽管不是必须的,但我还是建议你把maven输出的完成记录稍微过目一下,了解一下maven构建和打包一个java工程的打包过程。
下面是部署这个web工程,这里我就不说怎么用eclipse全家桶自动部署了,单单说一下手动部署。
打开tomcat路径下的/conf/server.xml文件,找到&Host&节点,在这个节点下添加下面的内容
&Context path="/SpringMVCStart" docBase="D:\SpringMVCStart\target\SpringMVCStart-1.0-SNAPSHOT" reloadable="true" &
&/Context&
把docBase属性的值替换成你自己的版本。
改好了以后启动tomcat,待启动成功之后,假设你没有改tomcat的监听端口,那么在浏览器地址栏输入,应该就可以看到"hello world"字样了。
0x2 数据库支持
在./pom.xml里面添加mysql-connector和jdbc相关依赖
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-jdbc&/artifactId&
&version&4.2.4.RELEASE&/version&
&/dependency&
&dependency&
&groupId&mysql&/groupId&
&artifactId&mysql-connector-java&/artifactId&
&version&5.1.38&/version&
&/dependency&
&dependency&
&groupId&commons-dbcp&/groupId&
&artifactId&commons-dbcp&/artifactId&
&version&1.4&/version&
&/dependency&
在./src/main/webapp/WEB-INF/SpringMVCStart-servlet.xml中配置datasource连接参数
&bean id="dataSource" class="mons.dbcp.BasicDataSource" destroy-method="close"&
&property name="driverClassName" value="com.mysql.jdbc.Driver" /&
&property name="url" value="jdbc:mysql://127.0.0.1:3306/world"/&
&!-- 修改为你自己的数据库地址--&
&property name="username" value="Knightingal"/&
&!-- 修改为你自己的用户名 --&
&property name="password" value="123456"/&
&!-- 修改为你自己的密码 --&
这里配置了一个mons.dbcp.BasicDataSource类型的实例,以及该实例中driverClassName,url,username,password成员变量的值。后续配置中可使用dataSource这个id引用该实例。
以及配置jdbcTemplate。
&bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"&
&property name="dataSource" ref="dataSource"/&
稍后在Controller中便可通过@Autowired注解将org.springframework.jdbc.core.JdbcTemplate类型的实例反向注入到名为jdbcTemplate的成员变量上,并且该实例中的dataSource成员变量已经注入了之前配置的id为dataSource的mons.dbcp.BasicDataSource类型实例。
至此数据源的配置就完成了。
0x3 在Controller中使用JdbcTemplate进行数据库操作
现在我们配置一个新的Controller进行数据库操作。在此之前我们先了解一下需要查询的数据库的表结构及数据。
这里我们使用MySql预装的Demo库World,其中有city,country,countrylanguage三张表,从名字就能猜出里面的数据是什么。本教程中只需要其中的city就可以了。也许你的MySql里面没有预装这个Demo库,没关系,我把city的表结构和一部分数据导出来了放到这里了
简单的说,city表的表结构如下:
auto_increment
CountryCode
Population
根据这表结构,我们可以建立一个名为City的bean
./src/main/java/org/home/knightingal/bean/City.java
public class City {
private String countryC
// getter and setter...
接下来新建一个Controller,接受一个请求来查询这张表,将查询结果放入City的列表作为查询请求的响应。
./src/main/java/org/home/knightingal/controller/CityController.java
//省略package和import
@Controller
@RequestMapping(value="/city")
public class CityController {
@Autowired
JdbcTemplate jdbcT
@RequestMapping(value="/simpleQueryCities")
@ResponseBody
public List&City& simpleQueryCities() {
final List&City& cities = new ArrayList&City&();
jdbcTemplate.query("select id, name, countryCode, district, population from city limit 0, 10", new RowCallbackHandler() {
public void processRow(ResultSet resultSet) throws SQLException {
System.out.println(resultSet.getString(2));
City city = new City();
city.setId(resultSet.getInt(1));
city.setName(resultSet.getString(2));
city.setCountryCode(resultSet.getString(3));
city.setDistrict(resultSet.getString(4));
city.setPopulation(resultSet.getInt(5));
cities.add(city);
重新构建之后在浏览器中输入,返回了500错误。但是在Tomcat的运行窗口中我们看到打印出了查询到的城市名字,说明查询是成功的。
那我们回过头看看500错误的描述,可以看到这样的信息:
No converter found for return value of type: class java.util.ArrayList
问题出在simpleQueryCities的返回值,这个方法返回的是一个ArrayList类型的对象,框架无法对这个对象进行转换,成为具备良好阅读性的响应体。
这时我们需要引入jackson作为converter。在./pom.xml里面添加jackson的依赖
&dependency&
&groupId&com.fasterxml.jackson.core&/groupId&
&artifactId&jackson-databind&/artifactId&
&version&2.7.3&/version&
&/dependency&
SpringMVC框架会自动识别出jackson并作为其converter,不需要做另行配置。
重新打包部署后,再次刷新页面,就可以看到处理成json格式的城市信息了。
0x4 引入Mybatis进行数据库操作
在./pom.xml中添加如下依赖
&dependency&
&groupId&org.mybatis&/groupId&
&artifactId&mybatis&/artifactId&
&version&3.4.0&/version&
&/dependency&
&dependency&
&groupId&org.mybatis&/groupId&
&artifactId&mybatis-spring&/artifactId&
&version&1.3.0&/version&
&/dependency&
第一个是mybatis的主包,另一个mybatis-spring可以将mybatis的代码无缝整合到spring中。
接下来配置一个简单的dao接口。由于只是个简单的演示项目,所以不打算添加常见的service层了,controller直接调用dao层。
./src/main/java/org/home/knightingal/dao/CityDao.java
public interface CityDao {
List&City& queryCities();
在CityController中加入对queryCities的调用
./src/main/java/org/home/knightingal/controller/CityController.java
@Controller
@RequestMapping(value="/city")
public class CityController {
@Autowired
CityDao cityD
@RequestMapping(value="/queryCities")
@ResponseBody
public List&City& queryCities() {
return cityDao.queryCities();
有了接口,总得有实现吧,还有那个cityDao总不能就这样放着等着运行的时候给你来个空指针异常吧。下面是通过mybatis做的CityDao的实现
./src/main/resources/org/home/knightingal/dao/CityDao.xml
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"&
&mapper namespace="org.home.knightingal.dao.CityDao"&
&select id="queryCities" resultType="org.home.knightingal.bean.City"&
select id, name, countryCode, district, population from city
limit 0, 10
以及cityDao变量的装配。./src/main/webapp/WEB-INF/SpringMVCStart-servlet.xml
&bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&
&property name="dataSource" ref="dataSource"/&
&bean id="cityDao" class="org.mybatis.spring.mapper.MapperFactoryBean"&
&property name="mapperInterface" value="org.home.knightingal.dao.CityDao" /&
&property name="sqlSessionFactory" ref="sqlSessionFactory" /&
&bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&
&property name="basePackage" value="org.home.knightingal.dao" /&
在配置文件中,我们可以看到cityDao的实际父类型是org.mybatis.spring.mapper.MapperFactoryBean,&property name="mapperInterface" value="org.home.knightingal.dao.CityDao" /&这行配置了cityDao的接口。&property name="sqlSessionFactory" ref="sqlSessionFactory" /&这行装配了MapperFactoryBean中的sqlSessionFactory成员变量,该变量中装配了dataSource,即我们之前配置的dataSource。由于@Autowired注解的作用,这个bean会自动注入给变量CityDao cityDao。
而org.mybatis.spring.mapper.MapperScannerConfigurer这个bean配置则指定了mybatis去那个路径下搜索dao接口关联的sql配置文件。
重新编译运行后输入地址即可看到运行结果。
0x5 加入jsp页面
目前为止mvc架构中我们已经有了controller和model部分,对于很多纯后台系统而言已经够了,并不是每个系统都一定要有一个前台展示的view。但是呢,既然说到这了,再把view的部分加上也不是什么难事。
首先是引入jsp依赖的jstl库
&dependency&
&groupId&javax.servlet&/groupId&
&artifactId&jstl&/artifactId&
&version&1.2&/version&
&/dependency&
jsp的配置,就不啰嗦是在哪个文件里面配的了。
&bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&
&property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/&
&property name="contentType" value="text/html"/&
&property name="prefix" value="/WEB-INF/views/"/&
&property name="suffix" value=".jsp"/&
在queryCities的请求中返回jsp页面queryCities,注意,去掉了@ResponseBody注解,否则一会儿你在页面上只能看到"queryCities"几个字,是不是顿时觉得自己萌萌哒?
@RequestMapping(value="/queryCities")
public String queryCities(
@RequestParam(value="countryCode", required=false) String countryCode,
Model model
City param = new City();
param.setCountryCode(countryCode);
List&City& cities = cityDao.queryCities(param);
model.addAttribute("cities", cities);
return "queryCities";
这里我还稍微修改了CityDao.queryCities()接口,让它可以接受一个City类型的入参,带入查询条件,
public interface CityDao {
List&City& queryCities(City param);
这么做的目的是验证mybatis动态sql的特性。
&mapper namespace="org.home.knightingal.dao.CityDao"&
&select id="queryCities" resultType="org.home.knightingal.bean.City"&
select id, name, countryCode, district, population from city
&if test="countryCode != null"&
and countryCode = #{countryCode}
limit 0, 10
最后为了完成查询结果的展示,现学现卖的写一个queryCities.jsp页面,根据之前的配置,放在/WEB-INF/views/目录下。
./src/main/webapp/WEB-INF/views/queryCities.jsp
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"
import="java.util.List, org.home.knightingal.bean.City"
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8"&
&title&queryCities&/title&
&table border="1"&
&th&ID&/th&
&th&NAME&/th&
&th&COUNTRY CODE&/th&
&th&DISTRICT&/th&
&th&POPULATION&/th&
List&City& cities = ((List&City&)request.getAttribute("cities"));
for (int i = 0; i & cities.size(); i++) {
&%= cities.get(i).getId() %&
&%= cities.get(i).getName() %&
&%= cities.get(i).getCountryCode() %&
&%= cities.get(i).getDistrict() %&
&%= cities.get(i).getPopulation() %&
关于这个jsp页面我就不做讲解了,我所有的前端水平只够写出这些来,一个样式看起来很乏味的表格,显示了一些从数据库里查出来的数据。
到目前为止,这个简单的spring+spring-mvc+mybatis工程的搭建演示过程的讲解就算完成了。整个工程开发从无到有的过程都在我之前给出的github仓库里,每一次提交我都打了tag,如果我有没讲明白的地方,就去那里看吧。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
System.out.println(&Hello world!&);
· 1026人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:}

我要回帖

更多关于 spring mvc基础教程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信