一、spring jar
核心包 | MVC | AOP | 日志相关 | 数据库相关 |
---|---|---|---|---|
spring-aop-4.3.9.RELEASE.jar | spring-web-4.3.9.RELEASE.jar | aspectjweaver-1.8.10.jar | commons-logging-1.1.1.jar | spring-tx-4.3.9.RELEASE.jar |
spring-beans-4.3.9.RELEASE.jar | spring-webmvc-4.3.9.RELEASE.jar | log4j-1.2.17.jar | spring-jdbc-4.3.9.RELEASE.jar | |
spring-context-4.3.9.RELEASE.jar | ||||
spring-core-4.3.9.RELEASE.jar | ||||
spring-expression-4.3.9.RELEASE.jar |
二、spring-MVC配置
- web.xml文件中的配置
<!-- web.xml文件中的配置 -->
<!--配置核心控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化参数指定springMVC的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--tomcat启动时初始化servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置编码过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- Spring-MVC配置
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀 -->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
三、java中的使用
1.获取请求参数
@Controller
public class Hello {
//请求映射
@RequestMapping("/hello")
public String helloword(){
//拼接上spring-MVC配置文件中的前缀和后缀
return "hello";
}
}
@RequestMapping("/hello")
/**
* 接受参数
* @RequestParam 注解贴在形参的前面
* value:参数的名称 default 形参的name
* required:参数是否为必须的 有@RequestParam注解时 默认值是true(不传参会报错,当有defaultValue时不会报错) 没有注解时传不传都行
* defaultValue :参数的默认值 没有传参时使用默认值 ; age= 传参却为空时是null 或""(String);
*/
public String paramTest(String name,@RequestParam(required = true)Integer age){
System.out.println("name = [" + name + "], age = [" + age + "]");
return "hello";
}
/**
* 当返回的参数数值为空串时: String显示"";基本数据类型会报错;其他数据类型会显示null
* 当返回的参数中没有pojo类中的数据时:String类型是"null"基本数据类型会显示各自的默认值;其他数据类型会显示null
*/
@RequestMapping("/pojo")
public String PojoTest(Person person){
System.out.println("person = [" + person + "]");
System.out.println("-"+person.getName()+"-");
return "hello";
}
2.设置响应信息
@RequestMapping("test1")
public ModelAndView test1(String name,Integer age){
//创建模型视图对象
ModelAndView m = new ModelAndView();
//指定视图
m.setViewName("hello");
//添加模型对象 (设置到 request作用域中)
m.addObject("name",name);
m.addObject("age",age);
return m;
}
@RequestMapping("test2")
//直接在参数列表中创建Map (设置Map到 request作用域中)
public String test2(String name,Integer age,Map<String,Object> map){
map.put("name",name);
map.put("age",age);
return "hello";
}
3.文件的上传
@RequestMapping("file")
public String testFile(HttpServletRequest request, MultipartFile file) throws IOException {
//获取文件的io流
InputStream is = file.getInputStream();
//获取文件名
String fileName = file.getOriginalFilename();
String [] strs = fileName.split("\.");
if(strs.length>=2){
fileName = UUID.randomUUID()+"."+strs[strs.length-1];
}else{
fileName = UUID.randomUUID()+"";
}
//获取项目的决定路径
String savePath = request.getServletContext().getRealPath(File.separator+"upload");
//创建文件对象UUID.randomUUID() 保证文件名唯一
File saveFile = new File(savePath+File.separator + fileName);
//查看目录是否存在
if(!saveFile.getParentFile().exists()){
//创建文件的目录
saveFile.getParentFile().mkdir();
}
//创建输出流对象
FileOutputStream out = new FileOutputStream(saveFile);
//copy文件 使用工具类需要导包commons-io-2.5.jar
IOUtils.copy(is,out);
/*byte[] b = new byte[1024];
int n=0;
while((n=is.read(b))!=-1){
out.write(b, 0, n);
}
is.close();
out.close();*/
return "hello";
}
<!--文件上传 spring-mvc.xml文件配置-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
4.处理异常
//@ControllerAdvice注解可以使全局的异常都转发到error页面 而不用每个controller都定义一个处理异常的方法
@ControllerAdvice
public class ErrorContreller {
//被@ExceptionHandler标注的类只能有异常类型的参数;@ExceptionHandler({Throwable的子类的数组})
@ExceptionHandler
public ModelAndView exception(Exception e){
ModelAndView m = new ModelAndView("error");
m.addObject("exception",e);
return m;
}
}
四、springMVC编码拦截器的配置
<!--配置编码过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!-- 初始化参数指定编码格式 -->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
五、spring-MVC类型转换器
1.简单类型不需要自定义类型转换器
- String-->Date
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date date
- String-->number
@NumberFormat(pattern = "#,###") int number
2.java 自定义类型转换器
/**
* 自定义类型转换器
* 实现Converter接口
* - 第一个泛型参数:原类型
* - 第二个泛型参数:目标类型
*/
@Component
public class StringBookConverter implements Converter<String,Book> {
@Override
public Book convert(String s) {
String[] strs = s.split("-");
return new Book(strs[0],strs[2]);
}
}
配置类型转换器
<mvc:annotation-driven conversion-service="conversionService"/>
<!--配置类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" >
<property name="converters">
<set>
<!-- 自定义的类型转换器 -->
<ref bean="stringBookConverter"/>
</set>
</property>
</bean>
六、加载静态资源
<!--使用默认的servlet处理 可以加载静态资源 只配置default-servlet-handler 会使spring-mvc请求找不到 需要配合下面的设置-->
<mvc:default-servlet-handler/>
<mvc:annotation-driven />
<!--
<mvc:annotation-driven>会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,
这是Spring MVC为@Controller分发请求所必需的,并且提供了数据绑定支持,
@NumberFormatannotation支持;
@DateTimeFormat支持;
@Valid支持读写XML的支持(JAXB);
读写JSON的支持(默认Jackson)等功能。
-->
七、拦截器的配置
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 拦截全部 -->
<ref bean="firstInterceptors"/>
<!-- 拦截指定的类型 *:代表一级目录 ; **:代表任意级目录-->
<mvc:interceptor>
<mvc:mapping path = "/x/**"/>
<ref bean="firstInterceptors"/>
</mvc:interceptor>
</mvc:interceptors>
/**
*方法执行的流程
* 当preHandle返回的是true时
* preHandle-->servletf发-->postHandle-->afterCompletion
* 当preHandle返回的是false时 只执行 preHandle
*/
@Component
public class FirstInterceptors implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("FirstInterceptors.preHandle");
//返回是true放行;false拦截
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptors.postHandle");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("FirstInterceptors.afterCompletion");
}
}