前言

上文书说了Spring相关的知识,对Spring来了个浅入浅出,大家应该了解到,Spring在三层架构中主做Service层,那还有Web层,也就是Controller层,这个就由SpringMVC来解决了。SpringMVC是Web层的一个框架,它是Spring的组成部分,可以先看看下面这张图:

SpringMVC工作原理

MVC模式在之前我已经写过博客了《Web开发模式》https://www.cnblogs.com/zyx110/p/11238644.html ,学SpringMVC之前有必要先看一下MVC模式。

SpringMVC框架主要由DispatcherServlet、处理器映射、控制器、视图解析器、视图组成,其工作流程如下:

1. 客户端请求提交到DispatcherServlet;

2. 由DispatcherServlet控制器寻找一个或多个HandlerMapping,找到处理请求的Controller;

3. DispatcherServlet将请求提交到Controller;

4. Controller调用业务逻辑处理后返回ModelAndView;

5. DispatcherServlet寻找一个或多个ViewResolver视图解析器,找到ModelAndView指定的视图;

6. 视图负责将结果显示到客户端。

在SpringMVC工作流程中包含4个SpringMVC接口,即DispatcherServlet、HandlerMapping、Controller和ViewResolver。SpringMVC所有的请求都经过DispatcherServlet来统一分发,在DispatcherServlet将请求分发给Controller之前需要借助SpringMVC提供的HandlerMapping定位到具体的Controller。

HandlerMapping接口负责完成客户请求到Controller映射。

Controller接口将处理用户请求,这和Java 中Servlet扮演的角色是一致的。一旦Controller处理完用户请求,将返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。

从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

ViewResolver接口(视图解析器)在Web应用中负责查找View对象,从而将相应结果渲染给客户。

基于注解的控制器

在使用Web应用开发时Controller是Web应用的核心,Controller实现类包含了对用户请求的处理逻辑,是用户请求和业务逻辑之间的桥梁就,是SpringMVC框架的核心部分,负责具体的业务逻辑处理。传统风格的控制器是实现Controller接口的类。传统风格的控制器不仅需要在配置文件中部署映射,而且只能编写一个处理方法,不够灵活。

基于注解的控制器具有以下两个优点:

  1. 在基于注解的控制器类中可以编写多个处理方法,进而可以处理多个请求(动作),这就允许将相关的操作编写在同一个控制器类中,从而减少控制器类的数量,方便以后的维护。

  2. 基于注解的控制器不需要在配置文件中部署映射,仅需要使用RequestMapping注释类型注解一个方法进行请求处理。

在SpringMVC中使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被SpringMVC框架扫描到,需要在配置文件中声明spring-context,并使用context:component-scan/元素指定控制器类的基本包(确保所有控制类都在基本包及其子包下)。示例如下:

<?
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:context
=
"http://www.springframework.org/schema/context"

      
xmlns:tx
=
"http://www.springframework.org/schema/tx"

      
xmlns:mvc
=
"http://www.springframework.org/schema/mvc"

      
xsi:schemaLocation
=
"http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans.xsd

      http://www.springframework.org/schema/context

      http://www.springframework.org/schema/context/spring-context.xsd

      http://www.springframework.org/schema/tx

      http://www.springframework.org/schema/tx/spring-tx.xsd

      http://www.springframework.org/schema/mvc

      http://www.springframework.org/schema/mvc/spring-mvc.xsd

       "
>

   
<!--配置注解要扫描的包-->

   
<context:component-scan
 
base-package
=
"com.my"
></context:component-scan>



   
<!--配置视图解析器-->

   
<bean
 
class
=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
>

       
<!--配置前缀-->

       
<property
 
name
=
"prefix"
 
value
=
"/"
></property>

       
<!--配置后缀-->

       
<property
 
name
=
"suffix"
 
value
=
".jsp"
></property>

   
</bean>

</beans>

说这么多,用实例说话吧

实例解说

Pom.xml

<dependencies>

 
<dependency>

   
<groupId>
junit
</groupId>

   
<artifactId>
junit
</artifactId>

   
<version>
4.11
</version>

   
<scope>
test
</scope>

 
</dependency>

 
<dependency>

   
<groupId>
javax.servlet
</groupId>

   
<artifactId>
javax.servlet-api
</artifactId>

   
<version>
3.1.0
</version>

 
</dependency>

 
<dependency>

   
<groupId>
javax.servlet
</groupId>

   
<artifactId>
jstl
</artifactId>

   
<version>
1.2
</version>

 
</dependency>

 
<dependency>

   
<groupId>
commons-logging
</groupId>

   
<artifactId>
commons-logging
</artifactId>

   
<version>
1.2
</version>

 
</dependency>



 
<dependency>

   
<groupId>
mysql
</groupId>

   
<artifactId>
mysql-connector-java
</artifactId>

   
<version>
5.1.38
</version>

 
</dependency>

 
<!--spring核心依赖-->

 
<dependency>

   
<groupId>
org.springframework
</groupId>

   
<artifactId>
spring-core
</artifactId>

   
<version>
5.1.5.RELEASE
</version>

 
</dependency>

 
<dependency>

   
<groupId>
org.springframework
</groupId>

   
<artifactId>
spring-beans
</artifactId>

   
<version>
5.1.5.RELEASE
</version>

 
</dependency>

 
<dependency>

   
<groupId>
org.springframework
</groupId>

   
<artifactId>
spring-context
</artifactId>

   
<version>
5.1.5.RELEASE
</version>

 
</dependency>

 
<dependency>

   
<groupId>
org.springframework
</groupId>

   
<artifactId>
spring-aop
</artifactId>

   
<version>
5.1.5.RELEASE
</version>

 
</dependency>

 
<dependency>

   
<groupId>
org.springframework
</groupId>

   
<artifactId>
spring-jdbc
</artifactId>

   
<version>
5.1.5.RELEASE
</version>

 
</dependency>

 
<dependency>

   
<groupId>
org.springframework
</groupId>

   
<artifactId>
spring-web
</artifactId>

   
<version>
5.1.5.RELEASE
</version>

 
</dependency>

 
<dependency>

   
<groupId>
org.springframework
</groupId>

   
<artifactId>
spring-webmvc
</artifactId>

   
<version>
5.1.5.RELEASE
</version>

 
</dependency>

 
<dependency>

   
<groupId>
org.springframework
</groupId>

   
<artifactId>
spring-expression
</artifactId>

   
<version>
5.1.5.RELEASE
</version>

 
</dependency>

 
<dependency>

   
<groupId>
org.springframework
</groupId>

   
<artifactId>
spring-tx
</artifactId>

   
<version>
5.1.5.RELEASE
</version>

 
</dependency>



</dependencies>

spring-config.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:context
=
"http://www.springframework.org/schema/context"

      
xmlns:tx
=
"http://www.springframework.org/schema/tx"

      
xmlns:mvc
=
"http://www.springframework.org/schema/mvc"

      
xsi:schemaLocation
=
"http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans.xsd

      http://www.springframework.org/schema/context

      http://www.springframework.org/schema/context/spring-context.xsd

      http://www.springframework.org/schema/tx

      http://www.springframework.org/schema/tx/spring-tx.xsd

      http://www.springframework.org/schema/mvc

      http://www.springframework.org/schema/mvc/spring-mvc.xsd

       "
>

   
<!--配置注解要扫描的包-->

   
<context:component-scan
 
base-package
=
"com.my"
></context:component-scan>

   
<mvc:annotation-driven></mvc:annotation-driven>



   
<!--配置spring-jdbcTemplate-->

   
<!--配置数据源-->

   
<bean
 
id
=
"dataSource"
 
class
=
"org.springframework.jdbc.datasource.DriverManagerDataSource"
>

       
<!--MySQL数据库驱动-->

       
<property
 
name
=
"driverClassName"
 
value
=
"com.mysql.jdbc.Driver"
></property>

       
<!--连接数据库的URL-->

       
<property
 
name
=
"url"
 
value
=
"jdbc:mysql://localhost:3306/bbb?useUnicode=true&amp;characterEncoding=UTF-8"
></property>

       
<!--连接数据库的用户名-->

       
<property
 
name
=
"username"
 
value
=
"root"
></property>

       
<!--连接数据库的密码-->

       
<property
 
name
=
"password"
 
value
=
"root"
></property>

   
</bean>

   
<!--配置JDBC模板-->

   
<bean
 
id
=
"jdbcTemplate"
 
class
=
"org.springframework.jdbc.core.JdbcTemplate"
>

       
<property
 
name
=
"dataSource"
 
ref
=
"dataSource"
></property>

   
</bean>

   
<!--配置事务-->

   
<bean
 
id
=
"txManager"
 
class
=
"org.springframework.jdbc.datasource.DataSourceTransactionManager"
>

       
<property
 
name
=
"dataSource"
 
ref
=
"dataSource"
></property>

   
</bean>

   
<!--注册事务注解驱动-->

   
<tx:annotation-driven
 
transaction-manager
=
"txManager"
></tx:annotation-driven>

   
<!--配置视图解析器-->

   
<bean
 
class
=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
>

       
<!--配置前缀-->

       
<property
 
name
=
"prefix"
 
value
=
"/"
></property>

       
<!--配置后缀-->

       
<property
 
name
=
"suffix"
 
value
=
".jsp"
></property>

   
</bean>

</beans>

web.xml

<?
xml version
=
"1.0"
 encoding
=
"UTF-8"
?>

<web-app>

 
<!--部署DispatcherServlet-->

 
<servlet>

   
<servlet-name>
springmvc
</servlet-name>

   
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>

   
<!--表示容器在启动时立即加载servlet-->

   
<load-on-startup>
1
</load-on-startup>

   
<init-param>

     
<param-name>
contextConfigLocation
</param-name>

     
<param-value>
classpath:spring-config.xml
</param-value>

   
</init-param>

 
</servlet>

 
<servlet-mapping>

   
<servlet-name>
springmvc
</servlet-name>

   
<!--处理所有URL-->

   
<url-pattern>
/
</url-pattern>

 
</servlet-mapping>



 
<!--处理中文乱码-->

 
<filter>

   
<filter-name>
encodingFilter
</filter-name>

   
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>

   
<init-param>

     
<param-name>
encoding
</param-name>

     
<param-value>
UTF-8
</param-value>

   
</init-param>

   
<init-param>

     
<param-name>
forceEncoding
</param-name>

     
<param-value>
true
</param-value>

   
</init-param>

 
</filter>

 
<filter-mapping>

   
<filter-name>
encodingFilter
</filter-name>

   
<url-pattern>
/*
</url-pattern>

 
</filter-mapping>



 
<!--设置访问静态资源-->

 
<servlet-mapping>

   
<servlet-name>
default
</servlet-name>

   
<url-pattern>
*.css
</url-pattern>

 
</servlet-mapping>

 
<servlet-mapping>

   
<servlet-name>
default
</servlet-name>

   
<url-pattern>
*.js
</url-pattern>

 
</servlet-mapping>

 
<servlet-mapping>

   
<servlet-name>
default
</servlet-name>

   
<url-pattern>
*.jpg
</url-pattern>

 
</servlet-mapping>

 
<servlet-mapping>

   
<servlet-name>
default
</servlet-name>

   
<url-pattern>
*.png
</url-pattern>

 
</servlet-mapping>

 
<servlet-mapping>

   
<servlet-name>
default
</servlet-name>

   
<url-pattern>
*.gif
</url-pattern>

 
</servlet-mapping>

 
<servlet-mapping>

   
<servlet-name>
default
</servlet-name>

   
<url-pattern>
*.mp3
</url-pattern>

 
</servlet-mapping>

 
<servlet-mapping>

   
<servlet-name>
default
</servlet-name>

   
<url-pattern>
*.mp4
</url-pattern>

 
</servlet-mapping>



</web-app>

User

package
 com
.
my
.
pojo
;



public
 
class
 
User
 
{

   
private
 
int
 id
;

   
private
 
String
 username
;

   
private
 
String
 password
;



   
public
 
User
()
 
{

   
}



   
public
 
User
(
int
 id
,
 
String
 username
,
 
String
 password
)
 
{

       
this
.
id 
=
 id
;

       
this
.
username 
=
 username
;

       
this
.
password 
=
 password
;

   
}



   
public
 
int
 getId
()
 
{

       
return
 id
;

   
}



   
public
 
void
 setId
(
int
 id
)
 
{

       
this
.
id 
=
 id
;

   
}



   
public
 
String
 getUsername
()
 
{

       
return
 username
;

   
}



   
public
 
void
 setUsername
(
String
 username
)
 
{

       
this
.
username 
=
 username
;

   
}



   
public
 
String
 getPassword
()
 
{

       
return
 password
;

   
}



   
public
 
void
 setPassword
(
String
 password
)
 
{

       
this
.
password 
=
 password
;

   
}



   
@Override

   
public
 
String
 toString
()
 
{

       
return
 
"User{"
 
+

               
"id="
 
+
 id 
+

               
", username='"
 
+
 username 
+
 
'''
 
+

               
", password='"
 
+
 password 
+
 
'''
 
+

               
'}'
;

   
}

}

UserDao

package
 com
.
my
.
dao
;



public
 
interface
 
UserDao
 
{

   
public
 
void
 add
();

   
public
 
void
 
delete
();

   
public
 
void
 update
();

   
public
 
void
 query
();

}

UserDaoImpl

package
 com
.
my
.
dao
.
impl
;



import
 com
.
my
.
dao
.
UserDao
;

import
 com
.
my
.
pojo
.
User
;

import
 org
.
springframework
.
beans
.
factory
.
annotation
.
Autowired
;

import
 org
.
springframework
.
jdbc
.
core
.
BeanPropertyRowMapper
;

import
 org
.
springframework
.
jdbc
.
core
.
JdbcTemplate
;

import
 org
.
springframework
.
jdbc
.
core
.
RowMapper
;

import
 org
.
springframework
.
stereotype
.
Repository
;



import
 java
.
util
.
List
;



@Repository
(
"userDao"
)

public
 
class
 
UserDaoImpl
 
implements
 
UserDao
 
{

   
@Autowired

   
//使用配置文件中的JDBC模板

  
private
 
JdbcTemplate
 jdbcTemplate
;



   
@Override

   
public
 
void
 add
()
 
{

       
String
 insertSql 
=
 
"insert into user values(null,?,?)"
;

       
for
 
(
int
 i
=
0
;
i
<
15
;
i
++){

           
Object
 parem1
[]
 
=
 
{
"成功"
,
"123456"
};

           jdbcTemplate
.
update
(
insertSql
,
parem1
);

       
}

       
System
.
out
.
println
(
"UserDao中的添加功能实现了"
);

   
}



   
@Override

   
public
 
void
 
delete
()
 
{

       
String
 deleteSql 
=
 
"delete from user where id=?"
;

       
Object
 parem2
[]
 
=
 
{
5
};

       jdbcTemplate
.
update
(
deleteSql
,
parem2
);

       
System
.
out
.
println
(
"UserDao中的删除功能实现了"
);

   
}



   
@Override

   
public
 
void
 update
()
 
{

       
String
 updateSql 
=
 
"update user set username=? , password=? where id =?"
;

       
Object
 parem3
[]
 
=
 
{
"修改"
,
"654321"
,
3
};

       jdbcTemplate
.
update
(
updateSql
,
parem3
);

       
System
.
out
.
println
(
"UserDao中的修改功能实现了"
);

   
}



   
@Override

   
public
 
void
 query
()
 
{

       
String
 selectSql 
=
 
"select * from user"
;

       
RowMapper
<
User
>
 rowMapper 
=
 
new
 
BeanPropertyRowMapper
<
User
>(
User
.
class
);

       
List
<
User
>
 list 
=
 jdbcTemplate
.
query
(
selectSql
,
rowMapper
,
null
);

       
System
.
out
.
println
(
"UserDao中的查询功能实现了"
);

       
for
 
(
User
 user 
:
 list
){

           
System
.
out
.
println
(
user
);

       
}

   
}

}

UserService

package
 com
.
my
.
service
;



public
 
interface
 
UserService
 
{

   
public
 
void
 add
();

   
public
 
void
 
delete
();

   
public
 
void
 update
();

   
public
 
void
 query
();

}


UserServiceImpl

package
 com
.
my
.
service
.
impl
;



import
 com
.
my
.
dao
.
UserDao
;

import
 com
.
my
.
dao
.
impl
.
UserDaoImpl
;

import
 com
.
my
.
service
.
UserService
;

import
 org
.
springframework
.
beans
.
factory
.
annotation
.
Autowired
;

import
 org
.
springframework
.
stereotype
.
Service
;



@Service

public
 
class
 
UserServiceImpl
 
implements
 
UserService
 
{



   
@Autowired

   
private
 
UserDao
 userDao 
;

   
@Override

   
public
 
void
 add
()
 
{

       userDao
.
add
();

   
}



   
@Override

   
public
 
void
 
delete
()
 
{

       userDao
.
delete
();

   
}



   
@Override

   
public
 
void
 update
()
 
{

       userDao
.
update
();

   
}



   
@Override

   
public
 
void
 query
()
 
{

       userDao
.
query
();

   
}

}

UserController

package
 com
.
my
.
controller
;



import
 com
.
my
.
service
.
UserService
;

import
 org
.
springframework
.
beans
.
factory
.
annotation
.
Autowired
;

import
 org
.
springframework
.
stereotype
.
Component
;

import
 org
.
springframework
.
stereotype
.
Controller
;

import
 org
.
springframework
.
stereotype
.
Service
;

import
 org
.
springframework
.
web
.
bind
.
annotation
.
RequestMapping
;



@Controller

@RequestMapping
(
"/user"
)

public
 
class
 
UserController
 
{

   
@Autowired

   
private
 
UserService
 userService
;



   
@RequestMapping
(
"/add"
)

   
public
 
String
 add
(){

       userService
.
add
();

       
return
 
"index"
;

   
}



   
@RequestMapping
(
"/delete"
)

   
public
 
String
 
delete
(){

       userService
.
delete
();

       
return
 
"index"
;

   
}



   
@RequestMapping
(
"/update"
)

   
public
 
String
 update
(){

       userService
.
update
();

       
return
 
"index"
;

   
}



   
@RequestMapping
(
"/query"
)

   
public
 
String
 query
(){

       userService
.
query
();

       
return
 
"index"
;

   
}

}

测试结果

结束

人生赢在转折处,改变从现在开始,分享的越多,你的价值增值越大。

往期推荐 《Java匹马行天下之学编程的起点——编程常识知多少》

《什么是数据结构》

《什么是抽象数据类型》

《学网络编程前的计算机知识普及》

《如何进行网络通信》

《天降大祸于斯人也——幸捡一命,深思我的程序员生涯》

《在你迷茫时不如学好一门语言》

《流行框架知多少》

《致Java程序员兄弟们的一封信》

《算法核心——空间复杂度和时间复杂度超详细解析》