Spring-MVC案例:Spitter的笔记

源码地址:https://github.com/Young4Dream/yan/tree/master/Maven_spittr

笔记:

1.当DispatcherServlet启动时,会创建Spring应用上下文,并加载配置文件或配置类中所声明的bean。getServletConfigClasses()方法中,要求DispatcherServlet加载应用上下文时,使用定义在WebConfig配置类中的bean。但是在SpringWeb应用中,通常还会有另外一个应用上下文,另外的应用上下文在ContextLoaderListener创建。我们希望DispatcherServlet加载包含Web组件的bean,如控制器、视图解析器以及处理器映射,二ContextLoaderListener要加载应用中其他的bean。这些bean通常是驱动应用后端的中间层和数据层组件。实际上AbstractAnnotationConfigDispatcherServletInitializer会同时创建DispatcherServlet和ContextLoaderListener。getServletConfigClasses方法返回的带有@Configuration注解的类将会用来定义DispatcherServlet应用上下文中的bean。getRootConfigClasses方法返回带有@Configuration注解的类将会用来配置ContextLoaderListener创建的应用上下文中的bean。
2.设置WebMvcConfigurerAdapter为WebConfig的父类,用来配置静态资源,并重写configureDefaultServletHandling方法,并使得默认的servlet生效:configurer.enable();
3.Controller中的@RequestMapping(method=GET,value="/")中的GET需要引入import static org.springframework.web.bind.annotation.RequestMethod.GET;
4.从Spring3.2开始,我们可以按照控制器的方式来测试SpringMVC中的控制器了,而不仅仅是作为POJO进行测试。Spring现在包含了一种mock Spring MVC并针对控制器执行HTTP请求的机制。这样的话,在测试控制器的时候,就没有必要再启动Web服务器和Web浏览器了。要注意引用的静态包!!!
5.类级别的@RequestMapping相当于命名空间,如果类级别的mapping为"/home",方法级别的mapping为"/method",那么得到此方法返回的视图名时所要指定的action为"/home/method"
[email protected]的参数是String[]类型,也就是说可以指定多个action,如{"/","/home"},这表示两个都有效
7.Model类型其实是一个Map,它会传递给视图,这样数据就能够渲染到客户端了,当调用model.addAttribute()方法并且不指定key的时候,那么key会根据值得对象类型推断确定,如果是List<Book>,则会默认为bookList,以后可能会用ModelAndView类型,此处先不追究了。
8.如果想显式声明key的话,也可以自行指定,model.addAttribute("key",Object obj)
9.如果希望使用非Spring类型,也可以用Map来代替Model,model.addAttribute()变更为model.put()即可,原理参见https://zhidao.baidu.com/question/564038740.html
10.有有参构造方法时,一定一定要给对应bean的类中添加无参构造方法!!!!!!!!!!!!!!!!!!否则启动时会报no default constructor found 异常
11.当java文件出现此错误:The type javax.servlet.ServletException cannot be resolved. It is indirectly referenced from required .class files,只需要添加tomcat的lib目录中的servlet-api.jar即可
12.fn:length()是jstl函数,返回字符串长度或集合中元素的数量。
13.<mvc:annotation-driven/>相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置。
14.<context:annotation-config/>是对包进行扫描,实现注释驱动Bean定义,同时将bean自动注入容器中使用。即解决了@Controller标识的类的bean的注入和使用。
15.配置如果没有<mvc:annotation-driven/>,那么所有的Controller可能就没有解析,所有当有请求时候都没有匹配的处理请求类,就都去<mvc:default-servlet-handler/>即default servlet处理了。添加上<mvc:annotation-driven/>后,相应的do请求被Controller处理,而静态资源因为没有相应的Controller就会被default servlet处理。总之没有相应的Controller就会被default servlet处理就ok了。
16.插入的sql语句最好写全,不然会因为顺序不对而错位:
String sql="insert into spitter(id,firstname,lastname,username,password,email) values(" +
"seq_spitter.nextval,:firstname,:lastname,:username,:password,:email" +
")";
17.跳转个人信息页面时报:Mapped class was not specified异常。
原因:没传Spitter.class进去。
解决:rowMapper=new BeanPropertyRowMapper<Spitter>(Spitter.class);
18.当你开发一个项目,如果你选择的是spring MVC 框架,而你在前台使用spring的标签时,那么你有可能出现在这个情况。
javax.servlet.jsp.JspTagException: Neither BindingResult nor plain target object for bean name ‘command‘ available as request attribute
方法:1为抛出异常原因,2为异常解决方法。
1. 原因: 进入spring:bind标签源码你可以看到
Object target = requestContext.getModelObject(beanName);
if (target == null) {
throw new IllegalStateException("Neither BindingResult nor plain target object for bean name ‘" +
beanName + "‘ available as request attribute");
}
beanName= <spring:bind path="command.spjg">的绿色部分
如果你是直接对某个页面进行请求,那么request中还没command这个对象
2.
在页面上加上
<jsp:useBean id="command" class="com.ztenc.proj.bean.AFRFOAP" scope="request" ></jsp:useBean>
红色部分填上你的绑定类
public String register(@Valid @ModelAttribute("spitter") Spitter spitter,BindingResult errors){
19.BindingResult和Errors同样可以起到校验的效果,它们同位于org.springframework.validation包中
20.实现国际化:
1.使用spring的<%@ taglib prefix="s" uri="http://www.springframework.org/tags"%>中的<s:message/>实现;
2.配置信息源:ResourceBundleMessageSource或ReloadableResourceBundleMessageSource,分别以A和B代称
A方案是在根路径下配置,名字与配置的BaseName有关,如:BaseName="a",那么在根路径下新建a.properties文件;
B方案是在整个系统中配置,可用classpath或file来修饰
3.使用方法:<s:message code="key"/>
21.Multipart文件上传见xmind文件
22.处理异常
22.1对于能转换成HttpStatus的异常
1.创建处理某类异常的类,让其继承RuntimeException
public class SpittleNotFoundException extends RuntimeException{}
2.添加@ResponseStatus注解,标明对应的HttpStatus的值,并自定义reason
@ResponseStatus(value=HttpStatus.NOT_FOUND,reason="Spittle Not Found")
3.例子:在(controller或Dao层都行)相关方法中加入try-catch块即可:
try {
spittle = jt.queryForObject(sql, rowMapper, id);
} catch (Exception e) {
throw new SpittleNotFoundException();
}
4.当出现错误时显示信息如下:
HTTP Status 404 - Spittle Not Found
type Status report
message Spittle Not Found
description The requested resource is not available.
Apache Tomcat/7.0.65
22.2对于无对应HttpStatus的异常:比如重复插入数据
1.创建处理异常的类
public class DuplicateSpitterException extends RuntimeException{}
2.在controller层新增方法,表示当此类中有抛出自定义异常DuplicateSpitterException时,指定对应的逻辑视图名
@ExceptionHandler(value=DuplicateSpitterException.class)
public String handleDuplicateSpitter(){
return "error/error";
}
[email protected]的作用就是监听DuplicateSpitterException,只要抛出DuplicateSpitterException类的异常便会转向相应的视图
4.这种方式可以处理同一个Controller类中抛出的DuplicateSpitterException异常
22.3处理全局异常
1.创建一个定义全局异常的类:public class APPWideException extends RuntimeException{}
2.创建一个专门处理全局异常的类,它其实是一个Controller,并且在其类上添加@ControllerAdvice,这样就可以监听所有Controller层抛出的异常
3.在APPWideExceptionController中定义全局异常的处理方法,指定逻辑视图
4.如果@ControllerAdvice监听到的异常在此类中有定义的处理方法,则会照此规则执行,如定义了APPWideException.class,捕捉到则执行error/appError处理
package com.spring.mvc.controller;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import com.spring.mvc.web.APPWideException;

@ControllerAdvice
public class APPWideExceptionController {
@ExceptionHandler(value=APPWideException.class)
public String appWideExceptionHandler(){
return "error/appError";
}
}
23.跨重定向请求数据
23.1可以使用redirect:/spitter/{username},前提是:model.addAttribute("username",spitter.getUsername());
23.2如果有多余参数,如model.addAttribute("id",spitter.getId());,那么会变为.../spitter/yan?id=***;
23.3使用model.addFlashAttribute("spitter",spitter)可以传递除String和数字类型外的数据,作用域为重定向完成为止,比session短。

时间: 2024-10-10 17:14:15

Spring-MVC案例:Spitter的笔记的相关文章

Spring MVC 学习笔记(二):@RequestMapping用法详解

一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置 <servlet>     <servlet-name>servletName</servlet-name>     <servlet-class>ServletClass</servlet-class> </servlet>

Spring MVC 配置笔记--基于JavaConfig

主要使用基于 JavaConfig 方式配置 配置 DispatcherServlet 通过继承抽象类AbstractAnnotationConfigDispatcherServletInitializer来自动配置 DispatcherServlet 和 Spring 应用上下文(不需在 xml 中配置) public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializ

[Spring MVC]学习笔记--DispatcherServlet

在上一篇我们介绍了Servlet,这一篇主要来看一下MVC中用到的DispatcherServlet(继承自HttpServlet). 1. DispatcherServlet在web.xml中被声明. <web-app> <servlet> <servlet-name>example</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet&l

Spring MVC学习笔记(一)--------准备篇

这一系列笔记将带你一步一步的进入Spring MVC,高手勿喷. 首先你得安装以下的工具: JDK,虽然JDK8已经发布了一段时间了,但是由于我们并不会使用到里面的新特性,所以JDK6以上版本皆可以(需加入到PATH环境变量中): Servlet Container,为了能运行WEB应用程序,因此需要一个Web Container,这里我们建议Tomcat即可: IDE,一个好的IDE不仅能提高你开发的效率,还能降低你学习的成本,我们选择的是IntelliJ: 构建工具,推荐使用Gradle,它

[转]Spring MVC 学习笔记 json格式的输入和输出

Spring mvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用 <!-- json --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-lgpl</artifactId> <version>1.8.1</version>

[Spring MVC]学习笔记--基础Servlet

Servlet是一个用Java编写的应用程序,在服务器上运行,处理请求的信息并将其发送到客户端. Servlet的客户端提出请求并获得该请求的响应. 对于所有的客户端请求,只需要创建Servlet的实例一次(这是和CGI(Common Gateway Interface)的重要区别,CGI是每个请求创建一个新实例),因此节省了大量的内存. Servlet在初始化后即驻留内存中,因此每次作出请求时无需加载. 下面通过一个例子来介绍如何编写一个简单的Servlet. 准备工作: 1. 下载并启动To

Spring Mvc笔记

Spring Mvc工作流程与模块功能 Spring Web MVC DispatcherServlet 的请求处理的工作流程如下图所示: 工作流程 (1)收到一个 HTTP 请求后, DispatcherServlet 根据HandlerMapping来选择并且调用适当的控制器 . (2)控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法.Service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中.

【Spring学习笔记-MVC-18.1】Spring MVC实现RESTful风格-同一资源,多种展现:xml-json-html

概要 要实现Restful风格,主要有两个方面要讲解,如下: 1. 同一个资源,如果需要返回不同的形式,如:json.xml等: 不推荐的做法: /user/getUserJson /user/getUserXML 这样做不符合Restful的原则,1个资源相当于变成了两个资源: 2. 对同一资源的CRUD操作 不推荐的做法: /user/addUser/ /user/getUser/123 /user/deleteUser/123 /user/updateUser/123 这样做也不符合Res

【Spring学习笔记-MVC-13】Spring MVC之文件上传

作者:ssslinppp       1. 摘要 Spring MVC为文件上传提供了最直接的支持,这种支持是通过即插即用的MultipartResolve实现的.Spring使用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver. 下面将具体讲解Spring MVC实现文件上传的具体步骤. 2. 添加Jar包 Spring MVC文件上传,需要添加如下两个jar包: commons-fil