SpringMVC回顾

1、什么是三层架构?

我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就 是浏览器服务器。在 JavaEE 开发中,几乎全都是基于 B/S架构的开发。那么在 B/S架构中,系统标准的三层架构 包括:表现层、业务层、持久层。三层架构在我们的实际开发中使用的非常多,所以我们课程中的案例也都是基于 三层架构设计的。 三层架构中,每一层各司其职,接下来我们就说说每层都负责哪些方面: 表现层: 也就是我们常说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求 web 层,web 需要接收 http 请求,完成 http 响应。 表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。 表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系) 业务层: 也就是我们常说的 service 层。它负责业务逻辑处理,和我们开发项目的需求息息相关。web 层依赖业 务层,但是业务层不依赖 web 层。 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的, 事务应该放到业务层来控制) 持久层: 也就是我们是常说的 dao 层。负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进 行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库 中。通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的。

三层架构的优点:

1)、结构更加的明确,各层只需专注于自己的事情

2)、表示层只和业务逻辑层有联系,提高了数据安全性

3)、有利于系统的分散开发,每一个层可以由不同的人员来开发,只要遵循接口标准

4)、利于各层逻辑的复用

2、什么是MVC 模型?

MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 是一种用于设计创建 Web 应用程序表现层的模式。MVC 中每个部分各司其职: Model (模型)

View (视图) : 通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。 通常视图是依据模型数据创建的。

Controller (控制器) : 是应用程序中处理用户交互的部分。作用一般就是处理程序逻辑的。 它相对于前两个不是很好理解,这里举个例子: 例如: 我们要保存一个用户的信息,该用户信息中包含了姓名,性别,年龄等等。 这时候表单输入要求年龄必须是 1~100 之间的整数。姓名和性别不能为空。并且把数据填充 到模型之中。 此时除了 js 的校验之外,服务器端也应该有数据准确性的校验,那么校验就是控制器的该做 的。 当校验失败后,由控制器负责把错误页面展示给使用者。 如果校验成功,也是控制器负责把数据填充到模型,并且调用业务层实现完整的业务需求。

3、Spring MVC是什么?

Spring web mvc是表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来。

4、Spring MVC处理流程是什么?

4.1处理流程图解

4.2步骤说明

1)用户发送请求至前端控制器

2)前端控制器收到请求,调用处理器映射器

3)处理器映射器根据请求url查找处理器,返回给前端控制器

4)前端控制器通过处理器适配器调用处理器

5)执行处理器

6)执行完成返回ModelAndView

7)处理器适配器将执行结果返回前端控制器

8)前端控制器调用视图解析器

9)视图解析器返回具体View

10)前端控制器对View进行渲染视图

11)前端控制器响应用户

4.3组件说明

1)DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于mvc模式中的C。 dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的求,它的存在降低了组件之间的耦合性。

2) HandlerMapping:处理器映射器

HandlerMapping负责根据用户请求找到Handler即处理器。 springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3)Handler:处理器

Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。

4)HandlAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

5)View Resolver:视图解析器

View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

6)View:视图

springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

5、WebApplicationInitializer有什么作用?

5.1作用

现在JavaConfig配置方式在逐步取代xml配置方式。而WebApplicationInitializer可以看做是Web.xml的替代,它是一个接口。通过实现WebApplicationInitializer,在其中可以添加servlet,listener等,在加载Web项目的时候会加载这个接口实现类,从而起到web.xml相同的作用。

5.2代码示例

package com.czxy.init;  

import org.springframework.web.WebApplicationInitializer;  
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;  
import org.springframework.web.filter.CharacterEncodingFilter;  
import org.springframework.web.servlet.DispatcherServlet;  
​  
import javax.servlet.FilterRegistration;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRegistration;  
​  
public class WebInitializer implements WebApplicationInitializer {  
 public void onStartup(javax.servlet.ServletContext servletContext) throws ServletException {  
 1.初始化 Spring 容器  
 AnnotationConfigWebApplicationContext applicationContext  = new AnnotationConfigWebApplicationContext();  
 applicationContext.register(SpringMvcConfig.class);  
 applicationContext.setServletContext(servletContext);  
​  
​  
 //2.设置springmvc前端控制器  
 ServletRegistration.Dynamic ds = servletContext.addServlet("springmvc", new DispatcherServlet(applicationContext));  
 ds.addMapping("/");  
 ds.setLoadOnStartup(2);  
​  
 //3 post乱码配置  
 FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("CharacterEncodingFilter", new CharacterEncodingFilter("UTF-8"));  
 encodingFilter.addMappingForUrlPatterns(null, true, "/*");  
​  
 }  
}  

6、如何配置视图解析器?

6.1作用

有些时候页面放置的位置存在多级文件夹,在SpringMVC中写跳转路径的时候总是会写很长,这样很不方便。有了SpringMVC的视图解析器就可以定义好页面路径的前缀(文件夹路径)和后缀(页面格式,jsp;html...),在书写路径的时候只需要写对应页面名字就可以了,着实提高了开发效率。

6.2代码示例

package com.czxy.init;  
​  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.ComponentScan;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.view.InternalResourceViewResolver;  
​  
@Configuration  
@ComponentScan("com.czxy")  
public class SpringMvcConfig {  
​  
 [@Bean](https://my.oschina.net/bean)  
 public InternalResourceViewResolver viewResolver(){  
 InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();  
 viewResolver.setPrefix("/WEB-INF/jsp");  
 viewResolver.setSuffix(".jsp");  
 return viewResolver;  
 }  
​  
}  

7、springmvc支持哪几种类型的参数绑定?

7.1默认支持的类型

说明:处理器方法形参中添加如下类型的参数,处理适配器会默认识别并进行赋值 。

1)HttpServletRequest :通过request对象获取请求信息

2)HttpServletResponse :通过response处理响应信息

3)HttpSession :通过session对象得到session中存放的数据

4)Model/ModelMap :

  • ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据。

  • 使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。 注意事项: 其本质都是使用Request对象向jsp传递数据。

示例:

@RequestMapping("/itemEdit")   
public String editItem( HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) {}

7.2简单类型

说明:当请求的参数名称和处理器方法形参名称一致时,会 将请求参数与形参进行绑定 。

整形:Integer、int

字符串:String

单精度:Float、float

双精度:Double、double

布尔型:Boolean、boolean

7.3pojo类型

说明:当请求参数过多时,可以采用pojo接受参数, 要求参数名称和pojo属性名称一致 。

示例:

//JavaBean定义  
public class Items {   
 private String name;   
 private Float price;   
}  
​  
//前台表单  
商品名称<input type="text" name="name" /> <br/>  
商品价格<input type="text" name="price" />   
​  
//后台  
@RequestMapping("/updateitem")   
public String updateItem(Items items) { }

注意事项:默认只支持简单数据类型,日期类型需要用到转换器

7.4包装pojo

示例:

//JavaBean  
public class QueryVo {   
 private Items items;   
 public Items getItems() { return items; }   
 public void setItems(Items items) { this.items = items; }   
}  
​  
//前台  
商品名称: <input type="text" name="items.name"/> <br/>  
商品id: <input type="text" name="items.price"/>   
​  
//后台  
@RequestMapping("/queryitem")   
public String queryItem(QueryVo queryVo) { }

7.5数组

示例:

//前台  
<input type="checkbox" name="ids" value="1">  
<input type="checkbox" name="ids" value="2">  
​  
//包装类  
public class QueryVo {   
 private String\[\] ids;   
}  
​  
//后台  
@RequestMapping("/queryitem")   
public String queryItem(QueryVo queryVo, String\[\] ids) { return "success"; }   
​

注意事项:Controller方法中可以用String[]接收,或者pojo的String[]属性接收。

7.6List

示例:

//包装类  
public class QueryVo {   
 private List<Items> itemList;   
}  
​  
//前端页面  
<c:forEach items="${itemList }" var="item" varStatus="s">   
<tr> <td> <input type="hidden" name="itemList\[${s.index}\].id" value="${item.id }"> <input type="text" name="itemList\[${s.index}\].name" value="${item.name }"> </td> <td><input type="text" name="itemList\[${s.index}\].price" value="${item.price }"></td> </tr>   
</c:forEach>   
name属性必须是包装pojo的list属性+下标+元素属性。  

8、@RequestParam 注解有什么作用?

说明:当请求的参数名称和处理器方法形参名称不一致时使用

9、@RequestMapping 注解有什么作用?

1)URL路径映射

2)窄化请求映射

在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。

3)请求方法限定

限定GET方法 @RequestMapping(method = RequestMethod.GET)

限定POST方法 @RequestMapping(method = RequestMethod.POST)

GET和POST都可以 @RequestMapping(method={RequestMethod.GET,RequestMethod.POST})

注意:设置限定请求方法后,请求方式不匹配会抛异常

10、controller方法返回值类型有哪些?

1)返回ModelAndView

例:

//controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。  
@RequestMapping("/itemList")   
public ModelAndView getItemList() throws Exception {   
 List<Items> itemList = itemService.getItemList();   
 ModelAndView modelAndView = new ModelAndView();  
 //把结果传递给页面   
 modelAndView.addObject("itemList", itemList);   
 //设置逻辑视图   
 modelAndView.setViewName("itemList");   
 //返回结果   
 return modelAndView;   
} 

2)返回void

说明:如果方法返回void,有3种情况:request请求转发、response重定向、ajax

例:

@RequestMapping("/itemList2")   
public void itemList2(HttpServletRequest request, HttpServletResponse response) throws Exception {   
request.getRequestDispatcher("/WEB-INF/jsp/itemList.jsp").forward(request, response);*/ PrintWriter writer = response.getWriter();   
response.setCharacterEncoding("utf-8");   
response.setContentType("application/json;charset=utf-8");   
writer.write("{\\"id\\":\\"123\\"}");   
} 

3)返回字符串

说明:如果方法返回String,有3种情况:逻辑视图名、redirect重定向、forward转发

例:

//逻辑视图名  
@RequestMapping(value={"/index","/index2"})  
public String index(){  
 return "itemslist";  
}  
​  
//重定向  
@RequestMapping("/update")  
public String update() throws ServletException, IOException{  
 return "redirect:queryItem.action";  
}  
​  
//转发  
@RequestMapping("/updateSubmit")  
public String updateSubmit() throws ServletException, IOException{  
 return "forward:editItem.action";  
}  
​

11、springmvc如何处理JSON数据交互?

1)使用到的注解

@RequestBody:将json、xml 等内容 转换 成Java对象。

@ResponseBody:将Java对象 转换 成 json、xml等内容。

2)前台代码

$.ajax({   
type:"post",   
url:"${pageContext.request.contextPath }/item/jsontest.action",   
data:'{"id":1,"name":"电冰箱","price":1999.0}',   
contentType:"application/json;charset=utf-8",   
success:function(data){   
 alert(data.id +":" +data.name);   
 }   
});  
​

3)后台代码

@RequestMapping("/jsontest")   
@ResponseBody   
public Items jsonTest(@RequestBody Items items) { return items; }

4)添加依赖

<dependency>  
 <groupId>com.fasterxml.jackson.core</groupId>  
 <artifactId>jackson-databind</artifactId>  
 <version>2.9.7</version>  
</dependency>  
​

12、如何实现文件上传?

1)添加依赖

<dependency>  
 <groupId>commons-fileupload</groupId>  
 <artifactId>commons-fileupload</artifactId>  
 <version>1.2.2</version>  
</dependency>  
​  
<dependency>  
 <groupId>commons-io</groupId>  
 <artifactId>commons-io</artifactId>  
 <version>2.3</version>  
</dependency>  
​

2)配置多媒体解析器

@Configuration  
@ComponentScan(basePackages = "com.czxy.controller")  
@EnableWebMvc  
public class MVCConfig {  
​  
 @Bean  
 public CommonsMultipartResolver multipartResolver(){  
 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();  
 // 设置所有的上传文件的总大小 10M  
 multipartResolver.setMaxInMemorySize(10\*1024\*1024);  
 // 设置单个文件上传的大小 4M  
 multipartResolver.setMaxUploadSize(4\*1024\*1024);  
 multipartResolver.setDefaultEncoding("utf-8");  
 return multipartResolver;  
 }  
}

3)前台页面

<form id="itemForm" action="${pageContext.request.contextPath }/user/upload.action" method="post" enctype="multipart/form-data">  
 姓名:<input type="text" name="name"/> <br/>  
 价格:<input type="text" name="price"/> <br/>  
 图片:<input type="file" name="picFile"/> <br/>  
 <input type="submit" value="提交" />  
 </form>  
​

4)后台代码

@RequestMapping("upload")  
public String upload(String name,Double price,  
@RequestParam(required=false,value="picFile") MultipartFile picFile) throws Exception{  
 System.out.println("姓名:" + name);  
 System.out.println("价格:" + price);  
    
 String originalFileName = picFile.getOriginalFilename();  
 System.out.println("上传文件名:" + originalFileName);  
 //保存文件到指定的位置  
 File file = new File("D:\\\temp", originalFileName);  
 picFile.transferTo(file);  
 return "itemslist";  
 }  
​

##13、拦截器如何实现?

作用:Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

1)自定义拦截器需实现HandlerInterceptor接口

@Component  
public class MyInterceptor1 implements HandlerInterceptor {  
   
 @Override  
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
 System.out.println("MyInterceptor1拦截器的preHandle");  
 return true;  
 }  
​  
 @Override  
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  
 System.out.println("MyInterceptor1拦截器的postHandle");  
 }  
​  
 @Override  
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {  
 System.out.println("MyInterceptor1拦截器的afterCompletion");  
 }  
}  
​

2)注册拦截器

@Configuration  
@ComponentScan("com.czxy")  
public class SpringMvcConfig extends WebMvcConfigurationSupport {  
​  
 @Autowired  
 private MyInterceptor myInterceptor;  
​  
 //注册连接器  
 @Override  
 protected void addInterceptors(InterceptorRegistry registry) {  
 InterceptorRegistration interceptorRegistration = registry.addInterceptor(myInterceptor);  
 interceptorRegistration.addPathPatterns("/**");  
   
 }  
}  
​

14、POM附录

<dependencies>  
 <dependency>  
 <groupId>org.springframework</groupId>  
 <artifactId>spring-webmvc</artifactId>  
 <version>5.0.2.RELEASE</version>  
 </dependency>  
 <dependency>  
 <groupId>javax.servlet</groupId>  
 <artifactId>javax.servlet-api</artifactId>  
 <version>3.1.0</version>  
 <scope>provided</scope>  
 </dependency>  
 <!--json转换-->  
 <dependency>  
 <groupId>com.fasterxml.jackson.core</groupId>  
 <artifactId>jackson-databind</artifactId>  
 <version>2.9.7</version>  
 </dependency>  
 <!--文件上传-->  
 <dependency>  
 <groupId>commons-fileupload</groupId>  
 <artifactId>commons-fileupload</artifactId>  
 <version>1.2.2</version>  
 </dependency>  
 <dependency>  
 <groupId>commons-io</groupId>  
 <artifactId>commons-io</artifactId>  
 <version>2.3</version>  
 </dependency>  
 </dependencies>  
 <build>  
 <plugins>  
 <plugin>  
 <groupId>org.apache.tomcat.maven</groupId>  
 <artifactId>tomcat7-maven-plugin</artifactId>  
 <version>2.2</version>  
 <configuration>  
 <port>9001</port>  
 <path>/</path>  
 </configuration>  
 </plugin>  
 </plugins>  
 </build>

15、Ajax附录

$.ajax({  
 type: "POST",  
 url: "test02",  
 data: JSON.stringify({username:"zhangsan",password:123}),  
 contentType:"application/json;charset=utf-8",  
 success: function(msg){  
 alert( msg.username );  
 }  
 });

16、统一异常处理

@ControllerAdvice  
public class ExceptionController {  
​  
 @ExceptionHandler(Exception.class)  
 @ResponseBody  
 public String handException(Exception e){  
 return e.getMessage();  
 }  
}  
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值