SpringMVC
一、导包
二、配置web.xml,加入核心功能处理器
<!--spring.xml-->
<!-- 实例化controller -->
<bean class="com.zhiyou.contriller.Mycontroller" name="/mycontroller"/>
<!--web.xml-->
<servlet>
<!-- 快捷键ctrl+shift+t -->
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 读取spring.xml文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
三、Controller的三种写法
- Controller第一种写法:实现Controller接口重写handleRequest方法
public class Mycontroller implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
ModelAndView mav=new ModelAndView();
mav.setViewName("success.jsp");
return mav;
}
}
-
Controller的第二种写法:实现HttpRequestHandler接口,重写handleRequest方法
-
全注解开发(推荐)
spring.xml <context:component-scan base-package="com.zhiyou.param"/>
四、springmvc的访问跳转
1、转发
转发使用关键字forward
2、重定向
重定向使用关键字redirect
五、springmvc执行流程
Springmvc工作流程描述(简易)
1. 客户端请求提交到DispatcherServlet
2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到 处理请求的handler。
3. DispatcherServlet将请求转发给到handler。
4. 通过HandlerAdatper执行handler调用业务逻辑处理后,返回ModelAndView
5. DispatcherServlet查询一个或多个ViewResoler视图解析器,将model渲染到viewss。
6.将viewss结果显示到客户端。
六、参数赋值
- 简单数据类型赋值
- 对象赋值
- 数值赋值
- restful风格
- 日期类型(不能直接处理,必须使用转换器)
- 定义转换器
- spring.xml中注册转换器
- 引用转换器
七、静态资源访问
<!-- 放行location目录下静态页面 -->
<mvc:resources location="/images/" mapping="/images/**" />
<mvc:resources location="/" mapping="/**" />
八、拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置需要拦截的路径 -->
<!-- 拦截restful风格 -->
<mvc:mapping path="/*.do/**"/>
<!-- 拦截.do类型-->
<mvc:mapping path="/*.do"/>
<!-- 配置不拦截的路径 -->
<mvc:exclude-mapping path="/login.do"/>
<!-- 实例化自己的拦截器 -->
<bean class="com.zhiyou.interceptor.UserInterceptor" id="userInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
//自定义拦截器
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
Object o=request.getSession().getAttribute("user");
System.out.println("进入拦截器");
//不为空,已登录放行;
if(o!=null){
//放行
System.out.println("放行");
return true;
}
System.out.println("拦截");
return false;
}
九、springmvc验证器
对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证
- 导包(四个)
- 在spring.xml的配置文件中添加验证器的配置信息
<!-- 添加校验器的配置 -->
<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" id="validator">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
</bean>
<!-- 引用校验器 -->
<mvc:annotation-driven validator="validator"/>
- 定义校验器空接口用于分类
- 在实体类属性上对其校验和分组
@NotNull(message="用户名不能为null",groups={UserLoginValidation.class,UserRegisterValidation.class})
@Pattern(regexp="^[a-zA-Z][a-zA-Z0-9_]{5,11}$",message="用户名只能以字母开头,包含字母,数字,下划线 共5-12位",groups={UserRegisterValidation.class})
private String username;
- 控制器中使用
public class UserController {
@RequestMapping(value="/register.do",method={RequestMethod.POST})
public String register(@Validated(value={UserRegisterValidation.class})User user,
BindingResult result,HttpSession session){
Map<String, String> map=new HashMap<>();
if(result.hasErrors()){
List<FieldError> errors=result.getFieldErrors();
for (FieldError fieldError : errors) {
String field=fieldError.getField();//拿到错误项
String message=fieldError.getDefaultMessage();//拿到错误提醒
System.out.println(field+" "+message);
map.put(field, message);
}
session.setAttribute("map", map);
return "redirect:register.jsp";
}
return "login.jsp";
}
}
十、文件上传下载
1.导入包(2个)
2.设置form:
<form action="upload.do" method="post" enctype="multipart/form-data">
上传头像:<input type="file" name="icon">
<input type="submit" value="上传">
</form>
- spring.xml配置文件上传解析器
<!-- 此处id不可更换 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1048576"/>
</bean>
4.controller配置
//上传图片
@RequestMapping("/upload.do")
public String upload(MultipartFile icon,HttpServletRequest request,Model model) throws IOException{
//把文件对象读入到流中
InputStream is=icon.getInputStream();
//获取文件的名字
String filename=icon.getOriginalFilename();
//根据请求对象获取images文件夹的路径
String realpath=request.getServletContext().getRealPath("/images");
filename = getFileName(filename);
//根据文件夹和文件名得到一个输出流对象
OutputStream os=new FileOutputStream(new File(realpath,filename));
IOUtils.copy(is, os);
model.addAttribute("filename",filename);
os.flush();
os.close();
is.close();
return "success.jsp";
}
public String getFileName(String fileName){
//获取后缀文件名
String extension=FilenameUtils.getExtension(fileName);
//使用uuid和当前日期的毫秒数来作为文件名字
String finalname=UUID.randomUUID().toString()+new Date().getTime()+"."+extension;
return finalname;
}
//下载图片
@RequestMapping("/download.do")
public void download(String name,HttpServletRequest request,HttpServletResponse response) throws IOException{
//设置相应的内容:下载,预览"attachment;filename="为下载;
response.setHeader("content-Disposition", "filename="+name);
//获取项目名加文件夹路径
String path=request.getServletContext().getRealPath("/images");
//通过路径和文件名创建文件对象
File file=new File(path,name);
//把该文件读入输入流
InputStream is=new FileInputStream(file);
OutputStream os=response.getOutputStream();
IOUtils.copy(is, os);
os.flush();
os.close();
is.close();
}
public String disFilename(HttpServletRequest request,String filename) throws UnsupportedEncodingException{
String userAgent = request.getHeader("User-Agent");
if(userAgent.toUpperCase().indexOf("FIREFOX")>=0){
filename = "=?UTF-8?B?"+(new String(Base64.encodeBase64(filename.getBytes("utf-8"))))+"?=";
}else{
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
web.xml配置汇总(ctrl+shift+t寻找关键词):
1.DispatcherServlet: spring.xml
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.CharacterEncodingFilter: 字符集过滤器
<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.xml配置汇总(ctrl+shift+t寻找关键词)
1.CommonsMultipartResolver: 文件上传下载
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1048576"/>
</bean>
2.LocalValidatorFactoryBean: 验证器
<!-- 添加校验器的配置 -->
<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" id="validator">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
</bean>
<!-- 引用校验器 -->
<mvc:annotation-driven validator="validator"/>
3.FormattingConversionServiceFactoryBean: 转换器
<bean
class="org.springframework.format.support.FormattingConversionServiceFactoryBean"
id="formattingConversionServiceFactoryBean">
<!-- 找到所注册的工厂bean下的属性 converters为set集合 -->
<property name="converters">
<set>
<!-- 实例化转换器 -->
<bean class="com.zhiyou.converter.MyDateConverter" />
</set>
</property>
</bean>
<!-- 引用转换器 -->
<mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean" />
4.InternalResourceViewResolver: 视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>