搭建SpringMVC项目
当你需要搭建一个SpringMVC时你需要考虑几个方面:
配置DispatcherServlet、SpringMVC启动
配置DispatcherServlet:1、web.xml
2.java配置 :实现AbstractAnnotationConfigDispatcherServletInitializer
第二种方法有容器版本要求,要求支持Servlet3.0的服务器,比如tomcat7.0或者更高的版本,而Servlet3.0 2009年就已经发布。
java的初始化器的好处就是可以定义任意数量的初始化器。只需要实现WebApplicationInitializer就可以往Web容器中注册其他组件。
/**
* 添加其他Servlet和Filter的示例代码
*
* @author ranran
*/
public class MyServletInitiation implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
Dynamic myServlet = servletContext.addServlet("myServlet", MyServlet.class);
myServlet.addMapping("/custom/**");
//配置mutilpart /tmp Linux是临时文件路径
myServlet.setMultipartConfig(new MultipartConfigElement("/tmp/myproject/uploads",2 * 1024 * 1024, 4 * 1024 * 1024,0));
FilterRegistration.Dynamic myFilter = servletContext.addFilter("myFilter", MyFilter.class);
myFilter.addMappingForUrlPatterns(null, false,"/custom/**");
}
}
启动SpringMVC
1、配置组件扫描包路径@ComponetScan(basePackages"")
2、添加ViewResolver bean显示声明
3、WebConfig类扩展WebMvcConfigurerAdapter 用来要求DispatcherServlet将对静态资源的请求转发到Servlet容器默认的Servlet上。
SpringMVC参数客户端传送参数方式:
Spring在Spring3.0以后支持Java 的参数校验,可以帮助我们只需要注解就可以进行参数校验。
Spring MVC处理multipart形式数据
当前端需要上传文件等,SpringMVC就需要处理multipart形式的数据。multipart将表单拆成多个部分,文件部分可以时二进制,并且会有Content-Type:image/jpge
Controller中配置multipart数据解释器
DispatcherServlet 委托Spring中使用MultipartResolver策略接口解析multipart请求数据。另外需要在Servlet初始化器或者web.xml中指定multipart的配置,例如文件上传过程中的临时文件路径。代码如上面第一段代码。
显示配置使用MultipartResolver的哪一个实现作为multipart数据的解析器。
配置好以后Controller中使用@RequestPart(MultipartFile file)注解接收文件参数
Spring 异常处理
Spring处理异常有三种方式
1、Spring会将异常自动映射为http状态
2、在自动义的异常上使用@ResponseStatus,从而将其映射为某一http状态
3、方法上使用@ExceptionHandler,来处理异常
@ExceptionHandler(多个Exception.class用英文逗号隔开)
该方法放在相应的Controller中就可以处理整个Controller中抛出的特定的异常。
如果要集中处理所有Controller中的抛出的异常
需要配合@ControllerAdvice
例如:
@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler
{
@ExceptionHandler(Exception.class)
public final ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex, WebRequest request) {
List<String> details = new ArrayList<>();
details.add(ex.getLocalizedMessage());
ErrorResponse error = new ErrorResponse(ApplicationConstants.SERVER_ERROR, details);
return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(RecordNotFoundException.class)
public final ResponseEntity<ErrorResponse> handleUserNotFoundException(RecordNotFoundException ex,
WebRequest request) {
List<String> details = new ArrayList<>();
details.add(ex.getLocalizedMessage());
ErrorResponse error = new ErrorResponse(ApplicationConstants.RECORD_NOT_FOUND, details);
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
}
@ControllerAdvice的类里面包含三种方法:
1、 带@ExceptionHandler注解的方法
2、带@InitBinder的方法
3、带@ModelAttribute注解的方法
Spring重定向
Spring重定向参数传递方式
1、通过Url模版进行重定向
url模版方式可以满足简单的String,和数字的参数传递
模版方式
Controller返回的字符串名以redirect开头,就是表示重定向,Controller中返回的模型数据会被拷贝给请求作为参数,使用模型如:“redirect:/hello/world/{username}”
那么模型中匹配到username的值会被放入url中,其他参数会被key=value的形式拼接在后。
2、使用flash属性
Spring提供通过RedirectAttributes 设置flash属性的方法,flash属性可以带着数据指导下一次请求,在重定向之前,flash属性会被复制到会话中,重定向之后flash属性会被转移到modle中。
Spring Web Flow
Spring Web Flow 是一个Web框架,是SpringMVC的扩展,适用于原属按规定流程运行的程序。其他的web框架,流程的定义分散在各个元素中,没有地方能够完整得描述整个流程。
Spring Web Flow 默认使用的是Spring表达式(Spring Expression Language)
通过配置一些bean来处理流程请求并执行流程,Spring Web Flow 不支持java配置,只能通过xml配置
Spring Web Flow 配置:
1、首先声明Spring Web Flow 的xml命名空间
2、装配流程执行器,它负责创建和执行流程
<flow:flow-excutor id=“flowExcutor”>
3、流程组册表(flow registry),负责加载流程定义,并让流程执行器能够使用它们
使用<flow:flow-registry>来配置
两种方式:1、通过base-path来定义
<!-- base-path定义了流程注册表会在 /WEB-INF/flows路径下-->
<flow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows">
<flow:flow-location-pattern value="*-flow.xml">
<flow:flow-registry>
2、显示声明流程定义文件的位置
<flow:flow-registry id="flowRegistry" >
<!--path显示声明流程定义文件的位置 id显示声明流程的ID-->
<flow:flow-location id="pizzaFlow" path="/WEB-INF/flows/pizzaflow.xml">
<flow:flow-registry>
在Spring中通过FlowHandlerMapping帮助DispatcherServlet将请求转发给Spring Web Flow
其配置如下:
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter" >
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
Spring Web Flow 主要有3个组件:
转移元素如果配置了on属性,如果触发了on的事件,就会转移到to流程种。on-exception=""发生特定异常时转移。
全局转移定义:
<global-transitions>
<transition on="cancle" to="endState">
</global-transitions>
定义了以后,所有的状态都默认拥有这个cancel转移
这个Spring Web Flow用xml写代码,太难受了吧。
保护Web应用 Spring Security
Spring Security提供来娃们总金额美国的安全性解决方案。能够在Web请求级别和方法调用级别处理身份认证和授权。
Spring 3.2种的配置比较简单,使用@EnableWebSecurity/@EnableWebMvcSecurity(SpringMVC框架开发可用)就可以启用安全功能,需要配置在扩展WebSecurityConfigurerAdapter的类上。@EnableWebMvcSecurity有参数解析器,可以通过带有@AuthenticationPrincipal注解的参数获得认证用户的principal。
重写WebSecurityConfigurerAdapter的三个config方法(必须重写否则整个应用会被锁住),只需要填充相应的表和字段,之后可以什么都不用做就可以控制系统的访问权限,乃至方法的调用权限。
Spring Security为方法的安全提供的注解:
@PreAuthorize和@PostAuthorize
方法上的注解使用可以参考该书14章