文章目录
一、文件上传
上传到本地服务器下,数据库中存放的是图片的路径
1.导入相关jar包
<!--支持文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.16.1</version>
</dependency>
2.网页端的要求
<form action="user/upload" enctype="multipart/form-data" method="post">
文件上传:<input type="file" name="myfile"/><br/>
<input type="submit" value="提交"/>
</form>
3.在springMVC配置文件上传解析器
<!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
4.Controller控制层处理
@Controller
@RequestMapping("user")
public class UserController {
@RequestMapping("upload")
public String upload(MultipartFile myfile,HttpServletRequest request) {
//获取文件上传真实保存的路径
String path=request.getServletContext().getRealPath("/upload");
//创建一个文件对象
File file=new File(path);
if(!file.exists()) {
file.mkdirs(); //路径不存在,手动创建
}
//获取文件名
String name=System.currentTimeMillis()+myfile.getOriginalFilename(); //System.currentTimeMillis()防止文件名重复而覆盖
File targetFile=new File(path+"/"+name);
System.out.println(targetFile);
try {
FileUtils.writeByteArrayToFile(targetFile,myfile.getBytes()); //工具类写入文件,转化为字节
} catch (IOException e) {
e.printStackTrace();
}
return ("login");
}
}
二、拦截器
filter:过滤网页、地址==>过滤一部分页面,但是还要另外设置Servlet的过滤,否则仍然可以通过Servlet进入,但是Servlet中也会存在不需要过滤的 部分,如拦截Servlet中的用户操作方法而不拦截用户注册登录方法
拦截器:springMVC每一个方法对应一个请求地址。
拦截器与Filter的区别:
拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖于servlet容器,过滤器依赖于servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
什么是web容器?
servlet没有main方法,那我们如何启动一个servlet?如何结束一个servlet?如何寻找一个servlet?这些都受控于另一个java应用,这个应用我们就称之为web容器。
最常见的tomcat就是这样一个容器.如果web服务器应用得到一个指向某个servlet的请求,此时服务器不是把servlet交给servlet本身,而是交给部署该servlet的容器.要由容器向servlet提供http请求和响应,而且要由容器调用servlet的方法,如doPost或者doGet。
web容器的作用
通信支持:利用容器提供的方法,可以简单的实现servlet与web服务器的对话.否则就要自己建立server搜创可贴,监听端口,创建新的流等一系列复杂的操作.而容器的存在就帮我们封装这一系列复杂的操作.使我们能够专注于servlet中的业务逻辑的实现.
生命周期管理:容器负责servlet的整个生命周期.如何加载类,实例化和初始化servlet,调用servlet方法,并使servlet实例能够被垃圾回收.有了容器,我们就不用花精力去考虑这些资源管理垃圾回收之类的事情.
多线程支持:容器会自动为接收的每个servlet请求创建一个新的java线程,servlet运行完之后,容器会自动结束这个线程.
声明式实现安全:利用容器,可以使用xml部署描述文件来配置安全性,而不必将其硬编码到servlet中。
jsp支持:容器将jsp翻译成java!
URL与servlet映射模式
servlet有三个名字:
客户知道的URL名:<url-pattern>/.do</url-pattern>
部署人员知道的秘密的内部名:<servlet-name>springMVC</servlet-name>
实际文件名:<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
创建拦截器
创建一个类实现HandlerIntercepter并重写接口中的方法
public class NotLoginIntercepter implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception { //请求处理完成后的方法
System.out.println("Interceptor_afterCompletion");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("Interceptor_postHandle");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2)
throws Exception { //相当于doFilter方法,返回boolean,true表示允许通过
System.out.println("Interceptor_preHandle");
}
}
创建的拦截器配置到springMVC配置文件中
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/> <!--表示user目录及其所有子目录下所有,*表示user目录下所有-->
<mvc:exclude-mapping path="/user/loginDo"/>
<mvc:exclude-mapping path="/user/login"/>
<mvc:exclude-mapping path="/user/register"/>
<bean class="com.zhiyou100.yj.intercepter.NotLoginIntercepter"></bean>
</mvc:interceptor>
</mvc:interceptors>
三、数据校验
1.引入jar包
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>classmate</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.5.3.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
2.实体类中添加注解(同一个属性可添加多个注解)
//validate在验证第一个失败后,还会继续验证其他
public class User {
@NotEmpty(message="用户名不能为空")
private String name;
@Length(min=6,max=12,message="密码长度在6~12之间")
private String password;
@Pattern(regexp="/^1([38]\\d|5[0-35-9]|7[3678])\\d{8}$/",message="手机格式不正确") //添加正则验证
private String phone;
}
3.接受的参数前要加注解,所有错误都被封装
@RequestMapping("register")
//@Valid:校验该对象
public String register(@Valid User user,BindingResult br,Model model) { //validate在验证第一个失败后,还会继续验证其他
//BindingResult br 将验证的错误信息都封装到BindingResult类中
if(br.hasErrors()) { //判断有没有错误信息
List<FieldError> fieldError = br.getFieldErrors();
Map<String,Object> errorMge = new HashMap<>();
for (FieldError f : fieldError) {
//遍历添加错误信息到Map中
errorMge.put(f.getField(),f.getDefaultMessage()); //f.getField():获取错误字段名;f.getDefaultMessage():预设错误提示信息
}
model.addAttribute("errorMge",errorMge);
return "forward:../register.jsp"; //转发不经过视图解析器
}
return "login";
}