前言
上文书说了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接口的类。传统风格的控制器不仅需要在配置文件中部署映射,而且只能编写一个处理方法,不够灵活。
基于注解的控制器具有以下两个优点:
-
在基于注解的控制器类中可以编写多个处理方法,进而可以处理多个请求(动作),这就允许将相关的操作编写在同一个控制器类中,从而减少控制器类的数量,方便以后的维护。
- 基于注解的控制器不需要在配置文件中部署映射,仅需要使用RequestMapping注释类型注解一个方法进行请求处理。
在SpringMVC中使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被SpringMVC框架扫描到,需要在配置文件中声明spring-context,并使用
xml version
=
"1.0"
encoding
=
"UTF-8"
?>
说这么多,用实例说话吧
实例解说
Pom.xml
junit
junit
4.11
test
javax.servlet
javax.servlet-api
3.1.0
javax.servlet
jstl
1.2
commons-logging
commons-logging
1.2
mysql
mysql-connector-java
5.1.38
org.springframework
spring-core
5.1.5.RELEASE
org.springframework
spring-beans
5.1.5.RELEASE
org.springframework
spring-context
5.1.5.RELEASE
org.springframework
spring-aop
5.1.5.RELEASE
org.springframework
spring-jdbc
5.1.5.RELEASE
org.springframework
spring-web
5.1.5.RELEASE
org.springframework
spring-webmvc
5.1.5.RELEASE
org.springframework
spring-expression
5.1.5.RELEASE
org.springframework
spring-tx
5.1.5.RELEASE
spring-config.xml
xml version
=
"1.0"
encoding
=
"UTF-8"
?>
web.xml
xml version
=
"1.0"
encoding
=
"UTF-8"
?>
springmvc
org.springframework.web.servlet.DispatcherServlet
1
contextConfigLocation
classpath:spring-config.xml
springmvc
/
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
default
*.css
default
*.js
default
*.jpg
default
*.png
default
*.gif
default
*.mp3
default
*.mp4
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程序员兄弟们的一封信》
《算法核心——空间复杂度和时间复杂度超详细解析》