Spring框架的学习阶段五---Spring-MVC

1. 在springmvc中使用servlet对象:

    java    4行

    java    4行

// 只要在控制器方法上加入request,response,session类型的参数,springmvc框架会把这些对象准备好作为方法参数传入
public String s1(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
}

还可以使用@CookieValue注解获取cookie的值

    java    7行

    java    7行

@RequestMapping("/servlet2")
// @CookieValue("user") 含义是到请求中找一个名为user 的cookie
public String s2(@CookieValue("user") String abc ) {
    System.out.println("user cookie的值是: " + abc);
    return "hello";
}

2. springmvc中的重定向

在视图名前面添加 redirect:,这时候springmvc就会把字符串当做重定向进行跳转,而不是再通过视图解析器进行解析

方法1: 使用了session传值
优点:信息安全、对象类型可以复杂
缺点:会占用服务器内存

    java    16行

    java    16行

@RequestMapping("/c1")
public String c1(HttpSession session) {
    System.out.println("c1....");
    // name=zhangsan 希望name传递给c2使用
    session.setAttribute("name", "zhangsan");
    return "redirect:/c2";
}

@RequestMapping("/c2")
public String c2(HttpSession session) {
    System.out.println("c2....");
    System.out.println("接收name:" +session.getAttribute("name"));
    session.removeAttribute("name"); // 用完后及时清除
    return "hello";
}

方法2:利用重定向地址后跟请求参数的方式
优点:不会占服务器内存,可以向站外地址传递参数
缺点:数据有大小限制、有安全问题、不能是复杂类型

    java    14行

    java    14行

@RequestMapping("/c1")
public String c1() {
    System.out.println("c1....");
    // name=zhangsan 希望name传递给c2使用
    return "redirect:/c2?name="+"zhangsan";
}

@RequestMapping("/c2")
public String c2(String name) {
    System.out.println("c2....");
    System.out.println("接收name:" + name);
    return "hello";
}

方法3:springmvc提供的办法
@RequestMapping("/c1")
// RedirectAttributes 由springmvc提供,专门在重定向时传参
public String c1(RedirectAttributes ra) {
System.out.println("c1....");
// ra.addAttribute("name", "张三"); // 使用了方法2
ra.addFlashAttribute("name","张三"); // 使用了方法1
return "redirect:/c2";
}

@RequestMapping("/c2")
public String c2(@ModelAttribute("name") String aaa) {
System.out.println("c2....");
System.out.println("接收name:" + aaa);
return "hello";
}

3. 管理异常

方式1:传统方式管理异常
// 自己用try -catch 管理异常

    java    10行

    java    10行

@RequestMapping("/exception1")
public String e1() {
    try {
        int i = 1 / 0;
        return "hello";
    } catch (Exception e) {
        return "error";
    }
}

方法2:使用@ExceptionHander , 把它加在要捕获异常的方法之上, 例如:

    java    6行

    java    6行

@ExceptionHandler(ArithmeticException.class)
public String catch1(ArithmeticException e) {
    System.out.println("catch1: "+e.getMessage());
    return "error";
}

注意:

  1. 该方法只能捕获本控制器类出现的异常
  2. 匹配异常类型时,会匹配一个最接近的异常类型

要做全局的异常处理:
@ControllerAdvice 全局控制器的通知类
加在通知类上,这样当某个控制器出现异常时,先找本类的异常处理器,
如果找不到,那么再到通知类中找全局的异常处理器

4. 文件上传

    html    7行

    html    7行

<form action="/upload" method="post" enctype="multipart/form-data">

    <input type="text" name="username">
    <input type="file" name="abc">
    <input type="submit" value="提交">
</form>

    java    10行

    java    10行

@RequestMapping("/upload")
public String upload(String username, MultipartFile abc) throws IOException {
    System.out.println("原始名:"+abc.getOriginalFilename());
    System.out.println("大小:"+abc.getSize());
    System.out.println("类型:"+abc.getContentType());
    // 把上传的文件保存到哪里
    abc.transferTo(new File("d:\\"+abc.getOriginalFilename()));
    return "hello";
}

    xml    6行

    xml    6行

<!-- 上传文件的解析器  -->
<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="1000000"/>
</bean>

5. SSM spring-mvc, spring, mybatis整合

mybatis
@Select , @Insert, @Delete, @Update,
@Param 用来把方法参数与sql中的#{}来对应,用在方法有多个参数时
spring
@Transactional 管理事务 加在需要事务的方法上,也可以加在类上
@Autowired 依赖注入 加在属性上,加在set方法上, 加在构造方法上 都是根据类型匹配

@Aspect 加在类上,表示此类是切面类(通知类)
@Around(切点表达式) 加在方法上, 表示环绕通知
@Before(切点表达式) 加在方法上, 表示前置通知
@After(切点表达式) 加在方法上, 表示后置通知(总会执行)
@AfterReturning(切点表达式) 加在方法上, 表示正常返回通知
@AfterThrowing(切点表达式) 加在方法上, 表示异常通知

都是配合 context:component-scan 标签使用,表示加了这个注解的类需要交给spring容器控制反转
@Controller 加在控制器类上
@Service 加在service(业务逻辑类)上
@Repository 加在dao实现类上(jpa, hibernate), 与mybatis结合没用用上
@Component 当某个类不好归类到三层结构时,可以用它

springmvc
@RequestMapping("路径") 映射请求路径, 可以加在类上,也可以加在方法上
如果类和方法都有这个注解:最终的路径是类的路径+方法路径
@GetMapping("路径") 专门处理get请求
@PostMapping("路径") 专门处理post请求
如果实际的请求与注解的格式不匹配,会报405 Method Not Allowed
get(查),post(新增),put(修改),delete(删除)

@ExceptionHandler 加在方法上,表示此方法是处理异常的方法
@ControllerAdvice 加在类上,经常配合@ExceptionHandler做全局异常处理
@ResponseBody 加在方法上,用来把方法的返回值转为json字符串作为响应
@RequestBody 加在方法参数上,用来把参数的json字符串还原为java对象

@PathVariable 加在方法参数上,用来获取路径中的参数
@CookieValue("cookie名") 加在方法参数上,用来获取请求参数中的cookie值
@DateTimeFormat(pattern="日期格式") 加在方法参数上,加在属性上,用来转换请求参数中的日期

@ModelAttribute("key") 用来接收重定向传递的参数值,需要配合RedirectAttributes一起使用
@SessionAttribute

@Cacheable @Cacheable (cacheNames = "user")找到user的缓存ache userCache = ;
User user = userCache.get(key#id);
if(user == null) {
user = 调用selectById方法查询数据库;
userCache.put("key#id", user);}
@CacheEvict @CacheEvict(cacheNames = "user", allEntries = true) // 让缓存的内容失效
@CachePut @CachePut(cacheNames = "user") // 思路将方法的执行结果替换缓存的内容

json转换
@JsonIgnore 加在属性上,转json时忽略此属性
@JsonProperty("新的属性名") 加在属性上,转json时改变属性名称
@JsonFormat(pattern="日期格式", timezone="GMT+8") 加在属性上,转换日期

猜你喜欢

转载自blog.csdn.net/sinat_42759524/article/details/84073722