配置DispatcherServlet核心分发器
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--我们经常使用的配置文件加载方式-->
<!-- <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param> -->
</servlet>
<!-- 加载默认mvc配置文件:springname-servlet.xml ,必须放在WEB-INF下面-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
//或者使用默认拦截/
<url-pattern>*.do</url-pattern>
</servlet-mapping>
配置方式访问
自定一个类实现一个controller接口,配置到springmvc.xml中对外提供访问方式
<bean name="/hello.do" class="cn.itcast.test.TestController"></bean>
处理器映射器(三种):
BeanNameUrlHandlerMapping
<!-- 配置处理器映射器,springmvc默认的处理器映射器,即使不配置,默认就使用这个来映射请求。 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
</bean>
SimpleUrlHandlerMaping
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!--简单url集中配置 -->
<property name="mappings">
<props>
<prop key="/hello.do">userController</prop>
<prop key="/do.do">userController</prop>
</props>
</property>
</bean>
ControllerClassNameHandlerMapping
这个Mapping一配置:我们就可以使用Contrller的 [类名.do]来访问这个Controller.(仅对实现controller接口有效,对实现HttpRequestHandler无效)
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
处理器适配器(两种):
SimpleControllerHandlerAdapter
<!--springmvc默认的处理器映射器,即使不配置默认加载-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter">
</bean>
HttpRequestHandlerAdapter
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
注解方式访问
开启注解扫描
““
““
配置视图解析器
<!--配置逻辑视图 物理视图=前缀+逻辑视图+后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
@Controller:
用于标识是处理器类.表示把我的控制器对象交给spring来创建。
@RequestMapping:
请求到处理器功能方法的映射规则;
@RequestParam
““
save( @RequestParam(defaultValue=”2”,value=”group”,required=true) String string) {
默认值 别名 是否必须
当使用别名的时候,前端提交的属性名需要和别名一致,即入参的请求参数名字
““
@RequestBody
将接收请求json数据自动封装到pojo对象中
@ResponseBody
把后台pojo对象转换json对象传给前台:只能是pojo对象,Map,List无效
@pathVariable
@RequestMapping("deleteById/{id}")
public String deleteById(@PathVariable int id) {}
中文乱码解决
get
第一种:在tomcat的servlet.xml
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
另外一种方法对参数进行重新编码:
String userName new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
post
<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>
日期格式问题转化
第一种在需要映射的类上进行添加注解转换
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
第二种自定日期格式转换类
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String resource) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (resource.contains("/")) {
resource=resource.replace("/", "-");
}
try {
return simpleDateFormat.parse(resource);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
在springmvc.xml中进行添加自定义转换器
<!-- 加载注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 转换器配置 -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class=" com.itheima.ssm.convert.DateConverter"/>
</set>
</property>
</bean>
拦截器:实现HandlerInterceptor接口
局部拦截器:
针对某个HandlerMapping进行配置。
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>
全局拦截器:
拦截所有映射请求拦截。
<!--拦截器 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.springmvc.filter.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.springmvc.filter.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
图片上传
CommonsMultipartResolver解析器依赖导入fileupload的2个jar包
配置解析器
<!-- 文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
读写在本地磁盘上
@RequestMapping("/editItemSubmit")
public String editItemSubmit(Items items, MultipartFile pictureFile)throws Exception{
//原始文件名称
String pictureFile_name = pictureFile.getOriginalFilename();
//新文件名称
String newFileName = UUID.randomUUID().toString()+pictureFile_name.substring(pictureFile_name.lastIndexOf("."));
//上传图片
File uploadPic = new File("F:/develop/upload/temp/"+newFileName);
if(!uploadPic.exists()){
uploadPic.mkdirs();
}
//向磁盘写文件
pictureFile.transferTo(uploadPic);
跨服务器上传
记得要修改图片服务器文件上传权限
//获取文件原始的名称
String originalFilename = file.getOriginalFilename();
//UUID生成新的不重复文件名
String string = UUID.randomUUID().toString().replace("-", "");
int lastIndexOf = originalFilename.lastIndexOf(".");
String substring = originalFilename.substring(lastIndexOf);
String newName =string + substring;
//跨服务器上传
Client client = Client.create();
//把文件关联到远程服务器
WebResource resource = client.resource(Commons.PIC_HOST+"/upload/"+newName);
//上传
resource.put(String.class, file.getBytes());
//回调函数
Map map = new HashMap();
map.put("success", true);
map.put("message", newName);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(JSON.toJSONString(map).toString());
异常处理器:实现HandlerExceptionResolver接口
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑
自定义异常处理器
““
在springmvc.xml中添加自定义异常处理器,spring会自动扫描该异常处理器:
异常处理器代码:实现HandlerExceptionResolver接口
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
//自定义异常处理器
public class CustomerResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj,
Exception exception) {
// 记录异常信息
String message = "";
if (exception instanceof CustomerException) {
// 捕获自定预期异常信息
CustomerException customerException=(CustomerException)exception;
message = customerException.getMessage();
} else {
// 捕获运行时异常,一般邮件通知程序人员,不能让客户看到异常
//StringWriter stringWriter = new StringWriter();
//PrintWriter printWriter = new PrintWriter(stringWriter);
//exception.printStackTrace(printWriter);
//message = stringWriter.toString();
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", message);
modelAndView.setViewName("error");
return modelAndView;
}
}
““
自定义异常类
public class CustomerException extends RuntimeException{
public CustomerException(String string){
super(string);
}
}
静态资源访问
如果在DispatcherServlet中设置url-pattern为/则必须对静态资源进行访问处理。
spring mvc 的<mvc:resources mapping="" location="">实现对静态资源进行映射访问。
如下是对js文件访问配置:
//** 表示访问所有子目录的文件
<mvc:resources location="/js/" mapping="/js/**"/>