笔记SSM

一、SpringMVC的视图

控制器方法统一的返回值为ModelAndView

1.ThymeleafView

当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被 SpringMVC 配置文件中所配置 的视图解析器解析,视图名称拼接视图前缀和视图 后缀所得到的最终路径,会通过 转发 的方式实现跳转

2.转发视图

SpringMVC 中默认的转发视图是 InternalResourceView
SpringMVC 中创建转发视图的情况:
当控制器方法中所设置的视图名称以 "forward:" 为前缀时,创建 InternalResourceView 视图,此时的视 图名称不会被SpringMVC 配置文件中所配置的视图解析器解析,而是会将前缀 "forward:" 去掉,剩余部 分作为最终路径通过转发的方式实现跳转。

3.重定向视图

SpringMVC中默认的重定向视图是RedirectView

当控制器方法中所设置的视图名称以 "redirect:" 为前缀时,创建 RedirectView 视图,此时的视图名称不 会被SpringMVC 配置文件中所配置的视图解析器解析,而是会将前缀 "redirect:" 去掉,剩余部分作为最 终路径通过重定向的方式实现跳转
注:
重定向视图在解析时,会先将redirect:前缀去掉,然后会判断剩余部分是否以/开头,若是则会自
动拼接上下文路径

4.视图控制器

<!--    开启mvc的注解驱动-->
    <mvc:annotation-driven/>
<!--视图控制器:为当前的请求直接设置视图名称,并实现页面跳转
若设置视图控制器,则只有视图控制器中的请求会被处理,其他请求将全部404
此时需要再配置一个标签:<mvc:annotation-driven/>

-->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>

二、RESTful

1.简介

REST Re presentational S tate T ransfer ,表现层资源状态转移。
资源:将服务器看作是有很多离散的资源组成

2.实现

它们分别对应四种基本操作: GET 用来获取资源, POST 用来新建资源, PUT 用来更新资源, DELETE 用来删除资源。
当前浏览器只能发送get和post请求

3.使用HiddenHttpMethodFilter处理put和delete请求

若要发送put'和delete请求,需要在web.xml中配置一个过滤器HiddenHttpMethodFilter
配置了过滤器之后,发送的请求需要满足两个条件,才能将请求方式转换为put或delete
1.当前请求必须为post
2.当前请求必须传输请求参数_method,_method的值才是最终的请求方式
//    @RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)
    @DeleteMapping("/user/{id}")

4.处理静态资源

工程的配置文件web.xml和tomcat的冲突时,以工程为准。

此时,浏览器发送的请求会优先被DispatchServlet进行处理,但是DispatcherServlet不能处理静态资源。

若配置


<!--    配置默认的servlet处理静态资源-->
    <mvc:default-servlet-handler/>

,此时浏览器发送的请求都会被DefaultServlet处理

但如果再加上<mvc:annotation-driven/>浏览器发送的请求会优先被DispatcherServlet处理,无法处理的再交给DefaultServlet处理

三、SpringMVC处理ajax请求

1.回顾ajax

    axios({
                    url:"",//请求路径
                    method:"",//请求方式
                    params:{},//以name=value&name=value的方式发送的请求参数
不管请求方式是get还是post,请求参数都会被拼接到请求地址后,获取请求参数通过request.gatparameter()
                    data:{}//以json格式发送的请求参数,请求参数会被保存到请求报文的请求体传输到服务器
                }).then(response=>{
                    console.log(response.data);
                })

get没有请求体

ajax所写的绝对路径是由浏览器解析的

2.@RequestBody

①将请求体中的内容和控制器方法的形参进行绑定,注解加在形参上。
使用@RequestBody注解将Json格式的请求参数转换为java对象:
a>引入Jackson的依赖
b>在SpringMVC配置文件中设置<mvc:annotation-driven/>
c>在处理请求的控制器方法的形参位置,直接设置json格式的请求参数要转换的java类型的形参,使用@RequestBody标识即可。
    public void testAjax(Integer id, @RequestBody Map<String,Object> map, HttpServletResponse httpServletResponse) throws IOException {

②@ResponseBody注解响应Json格式的数据

@ResponseBody:将所标识的控制器方法的返回值作为响应报文的响应体响应到浏览器中

一般响应到浏览器中的数据都是一个java对象

a>引入Jackson的依赖
b>在SpringMVC配置文件中设置<mvc:annotation-driven/>

c>将需要转换为json字符串的java对象直接作为控制器方法的返回值,使用@ResponseBody标识 

//响应浏览器list集合
@RequestMapping("/test/ResponseBody/json")
@ResponseBody
public List<User> testResponseBody(){
User user1 = new User(1001,"admin1","123456",23,"男");
User user2 = new User(1002,"admin2","123456",23,"男");
User user3 = new User(1003,"admin3","123456",23,"男");
List<User> list = Arrays.asList(user1, user2, user3);
return list;
}
//响应浏览器map集合
@RequestMapping("/test/ResponseBody/json")
@ResponseBody
public Map<String, Object> testResponseBody(){
User user1 = new User(1001,"admin1","123456",23,"男");
User user2 = new User(1002,"admin2","123456",23,"男");
User user3 = new User(1003,"admin3","123456",23,"男");
Map<String, Object> map = new HashMap<>();
map.put("1001", user1);
map.put("1002", user2);
map.put("1003", user3);
return map;
}
//响应浏览器实体类对象
@RequestMapping("/test/ResponseBody/json")
@ResponseBody
public User testResponseBody(){
return user;
}

3.@RestController注解

@RestController相当于@Controller+@ResponseBody

4.文件上传和下载

都是文件复制的过程

①文件下载

@RequestMapping("/testDown")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws
IOException {
//获取ServletContext对象
ServletContext servletContext = session.getServletContext();
//获取服务器中文件的真实路径
String realPath = servletContext.getRealPath("/static/img/1.jpg");
//创建输入流
InputStream is = new FileInputStream(realPath);
//创建字节数组
byte[] bytes = new byte[is.available()];//is.available()获取输入流所对应文件的字节数
//将流读到字节数组中
is.read(bytes);
//创建HttpHeaders对象设置响应头信息
MultiValueMap<String, String> headers = new HttpHeaders();
//设置要下载方式以及下载文件的名字
headers.add("Content-Disposition", "attachment;filename=1.jpg");
//设置响应状态码
HttpStatus statusCode = HttpStatus.OK;
//创建ResponseEntity对象
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers,
statusCode);
//关闭输入流
is.close();
return responseEntity;
}
ResponseEntity:可以作为控制器方法的返回值,表示响应到浏览器的完整的响应报文

路径分隔符不知道是什么时,用File.separator来拼接字符串

②文件上传

文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data",以二进制的方式传输数据

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!--必须通过文件解析器的解析才能将文件转换为MultipartFile对象-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>

获取文件上传解析器是通过bean的id来获取的

解决文件重名问题:


  //  获取上传文件的名字
        String filename = photo.getOriginalFilename();
        //解决文件重名的问题
        String substring = filename.substring(filename.lastIndexOf("."));
        //获取uuid
        String uuid = UUID.randomUUID().toString();
        //拼接一个新的文件名
        filename=uuid+substring;

5.拦截器

①拦截器的配置

由过滤器过滤后的请求交给DispatherServlet进行处理

拦截器用于拦截控制器方法的执行

<mvc:interceptor>
<mvc:mapping path="/**"/> //对多层目录的请求进行处理
<mvc:exclude-mapping path="/testRequestEntity"/>
<ref bean="firstInterceptor"></ref>
</mvc:interceptor>

②拦截器的三个方法:

preHandle():在控制器方法执行之前执行,其返回值表示对控制器方法的拦截(false)或放行(true)、 

postHandle():在控制器执行之后执行

aftercompletion():在控制器方法执行之后,且渲染视图完毕之后执行

③多个拦截器的执行顺序:

和SpringMVC的配置文件中的顺序有关:preHandle()按照配置的顺序执行

postHandle()和aftercompletion()按照配置的反序执行

④若拦截器方法中有某个拦截器的preHandle()返回了false,

拦截器的preHandle()返回false和它之前的拦截器的preHandle()都会执行

所有的拦截器的postHandle()都不执行

拦截器的preHandle()返回false之前的拦截器的afterCompletion()会执行0

6.使用xml配置异常处理

 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.ArithmeticException">error</prop>
            </props>
        </property>
    </bean>

key:设置要处理异常的全类名

value:设置出现该异常时要跳转的页面所对应的的逻辑视图

设置共享在请求域中的异常信息的属性名:

<property name = "exceptionAttribute" value = "ex" ></property>

7.使用注解配置异常处理

//将当前类标识为异常处理的组件
@ControllerAdvice
public class ExceptionController {
    @ExceptionHandler(ArithmeticException.class)
    public String handleException(Throwable ex, Model model){
        model.addAttribute("ex",ex);
        return "error";
    }
}

8.注解配置SpringMVC

创建初始化类,代替 web.xml
创建 SpringConfig 配置类,代替 spring 的配置文件
创建 WebConfig 配置类,代替 SpringMVC 的配置文件

四、SpringMVC的执行流程

1.SpringMVC常用组件
DispatcherServlet 前端控制器
HandlerMapping 处理器映射器
Handler 处理器
HandlerAdapter 处理器适配器
ViewResolver 视图解析器
View 视图
spring创建出来的容器为父容器
springmvc 创建出来的容器为子容器
子容器可以访问到父容器中的bean
五、SSM的整合
springMVC的ioc容器是在DispatcherServlet初始化完成的,ioc容器创建完之后会被放在 最大的应用域中
①导入依赖
②配置web.xml(两个过滤器,一个前端控制器,一个监听器)
③配置springmvc.xml(视图解析器,注解驱动,默认资源,视图控制器,文件上传解析器)
springmvc的特点:组件化,即插即用
springmvc中只需要扫描控制层组件
④配置spring.xml(扫描组件,配置数据源)
service层交给Spring来管理
⑤spring整合mybatis
mybatis中比较核心的两个步骤:配置mybatis的核心配置文件,mapper接口和映射文件
在mybatis中是面向接口来执行sql语句的
​<!--    配置SqlSessionFactoryBean,可以省略获取工厂的过程,在ioc容器中获取工厂提供的bean
可以直接在ioc容器中获取SQLSessionFactory对象-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!--        设置Mybatis的核心配置文件的路径-->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!--        设置数据源-->
        <property name="dataSource" ref="dataSource"></property>
<!--        设置类型别名所对应的包-->
        <property name="typeAliasesPackage" value="com.zhou.ssm.pojo"></property>
<!--        设置映射文件的路径,只有映射文件的包和mapper接口的包不一致时需要设置-->
<!--        <property name="mapperLocations" value="classpath:mappers/*.xml"></property>-->
<!--        配置分页插件-->
<!--        <property name="plugins">-->
<!--            <array>-->
<!--                <bean class="com.github.pagehelper.PageInterceptor"></bean>-->
<!--            </array>-->
<!--        </property>-->
    </bean>
<!--    配置mapper接口的扫描,可以将指定包下所有的mapper接口,
        通过SqlSession创建代理实现类对象,并将这些对象交给ioc容器管理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.zhou.ssm.mapper"></property>
</bean>

​

⑥配置事务

<!--    配置事务管理器(注解用的多)-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
<!--    开启事务的注解驱动
将使用注解@Transactional标识的方法或类中的所有方法进行事务管理
-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

完结撒花

SpringBoot见

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值