主流的开发架构一般有两种,一种是 C/S 架构,即客户端/服务器,另一种是 B/S 架构,也就是浏览器/服务器。Java非常适合用于B/S架构的开发,在B/S 架构中,系统被分为标准的三层架构,包括:表现层、业务层、持久层。三层架构各司其职,协调运转,构成了一个完整的网站架构,如下图:
负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求web 层, web 需要接收 http 请求,完成 http 响应,表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。它的设计一般都使用 MVC 模型
表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。
负责业务逻辑处理,和我们开发项目的需求息息相关。 web 层依赖业务层,但是业务层不依赖 web 层。同时业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性,那么应该在业务层进行事务控制。
负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的
MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,
是一种用于设计创建 Web 应用程序表现层的模式。 MVC 中每个部分各司其职:
Model(模型)
通常指的就是我们的数据模型。作用一般情况下用于封装数据。
View(视图)
通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。通常视图是依据模型数据创建的。
Controller(控制器)
是应用程序中处理用户交互的部分。 作用一般就是处理程序逻辑的。
SpringMVC 就是Web表现层的一种框架,是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,随着 Spring3.0 的发布, SpringMVC全面超越 Struts2,成为最优秀的 MVC 框架。
它通过一套注解(@Controller),让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。
下面引用Spring官网中的一张图来描述SpringMVC在三层架构中的位置。
共同点
区别
在web层中传给业务层的数据都是基于 key=value 形式的。SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的
示例
JSP代码
点击发送id到业务层
业务层代码
@Controller
@RequestMapping(path = "/hello")
public class HelloController {
@RequestMapping(path = "/testId")
public String sayHello(String id){
System.out.println(id);
return "success";
}
}
必须保证超链接中的属性名和RequestMap对应的方法参数名保持一致
基本类型参数
包括基本类型和 String 类型
POJO 类型参数
包括实体类,以及关联的实体类
数组和集合类型参数:
包括 List 结构和 Map 结构的集合(包括数组)
SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
如果是基本类型或者 String 类型
要求我们的参数名称必须和控制器中方法的形参名称保持一致。 (严格区分大小写)
如果是 POJO 类型,或者它的关联对象
要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
如果是集合类型,有两种方式
第一种:
要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。给 List 集合中的元素赋值, 使用下标。给 Map 集合中的元素赋值, 使用键值对。
第二种:
接收的请求参数是 json 格式数据。需要借助一个注解实现。
前端代码
控制器代码
@Controller
@RequestMapping("/account")
public class AccountController {
@RequestMapping("/updateAccount")
public String updateAccount(User user){
System.out.println("执行成功"+user);
return "success";
}
}
需要在web.xml中配置一个拦截器,如下:
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
characterEncodingFilter
/*
1.自定义一个类实现Converter 接口
public class StringToDate implements Converter {
@Override
public Date convert(String s) {
if (s==null){
throw new RuntimeException("请传入正确参数");
}
DateFormat format=new SimpleDateFormat("yyyy-MM-dd");
try{
return format.parse(s);
} catch (ParseException e) {
throw new RuntimeException("类型转换失败");
}
}
}
2.在 spring 配置文件中配置类型转换器
3.在 annotation-driven 标签中引用配置的类型转换服务
作用:把请求中指定名称的参数给控制器中的形参赋值。
属性
示例
jsp 中的代码:
requestParam 注解
Controller代码:
@RequestMapping("/useRequestParam")
public String useRequestParam(@RequestParam("name")String username,
@RequestParam(value="age",required=false)Integer age){
System.out.println(username+","+age);
return "success";
}
作用:用于获取请求体内容。 直接使用得到是 key=value&key=value…结构的数据,get 请求方式不适用。
属性
示例
jsp 中的代码:
requestBody 注解 get 请求
Controller代码:
@RequestMapping("/useRequestBody")
public String useRequestBody(@RequestBody(required=false) String body){
System.out.println(body);
return "success";
}
作用:用于绑定 url 中的占位符。 例如:请求 url 中 /delete/{id}, 这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性
示例
jsp 中的代码:
pathVariable 注解
Controller代码:
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable("id") Integer id){
System.out.println(id);
return "success";
}
作用:用于获取请求消息头。(不怎么用)
属性
示例
jsp 中的代码:
获取请求消息头
Controller代码:
@RequestMapping("/useRequestHeader")
public String useRequestHeader(@RequestHeader(value="Accept-Language",
required=false)String requestHeader){
System.out.println(requestHeader);
return "success";
}
作用:用于把指定 cookie 名称的值传入控制器方法参数。
属性
示例
jsp 中的代码:
绑定 cookie 的值
Controller代码:
@RequestMapping("/useCookieValue")
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false)String cookieValue){
System.out.println(cookieValue);
return "success";
}
作用
该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
属性
value:用于获取数据的 key。 key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
示例
jsp 中的代码:
测试 modelattribute
Controller代码:
/**
* 被 ModelAttribute 修饰的方法
* @param user
*/
@ModelAttribute
public void showModel(User user) {
System.out.println("执行了 showModel 方法"+user.getUsername());
}
/**
* 接收请求的方法
* @param user
* @return
*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user) {
System.out.println("执行了控制器的方法"+user.getUsername());
return "success";
}
作用 :用于多次执行控制器方法间的参数共享
属性
示例
jsp 中的代码:
存入 SessionAttribute
取出 SessionAttribute
清除 SessionAttribute
Controller代码:
@Controller("sessionAttributeController")
@RequestMapping("/springmvc")
@SessionAttributes(value ={"username","password"},types={Integer.class})
public class SessionAttributeController {
@RequestMapping("/testPut")
public String testPut(Model model){
model.addAttribute("username", "泰斯特");
model.addAttribute("password","123456");
model.addAttribute("age", 31);
//跳转之前将数据保存到 username、 password 和 age 中,因为注解@SessionAttribute 中有
这几个参数
return "success";
}
@RequestMapping("/testGet")
public String testGet(ModelMap model){
System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("a
ge"));
return "success";
}
@RequestMapping("/testClean")
public String complete(SessionStatus sessionStatus){
sessionStatus.setComplete();
return "success";
}
}