前言

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

Spring MVC浅入浅出—不吹牛逼不装逼_第1张图片

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,并使用元素指定控制器类的基本包(确保所有控制类都在基本包及其子包下)。示例如下:























说这么多,用实例说话吧

实例解说

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





































































web.xml










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"
;

}

}

测试结果

结束
Spring MVC浅入浅出—不吹牛逼不装逼_第2张图片

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

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

《什么是数据结构》

《什么是抽象数据类型》

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

《如何进行网络通信》

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

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

《流行框架知多少》

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

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