学习内容:学习Spring框架(Day52)
1、SpringMVC文件上传
2、Spring发送邮件
3、拦截器
4、日志
1、SpringMVC文件上传
(1)需要的jar包
commons-fileupload.jar
(2)在mvc-servlet.xml文件配置文件上传解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 可选属性,最大上传字节-->
<property name="maxUploadSize" value="100000"/>
</bean>
(3)上传多个文件
创建upload.js页面
<form action="/file/upload" method="post" enctype="multipart/form-data">
文件描述:<input type="text" name = "desc"><br>
选择文件:<input type="file" name="file" ><br>
选择文件:<input type="file" name="file"><br>
<input type="submit" value="上传">
</form>
上传多个文件
@PostMapping("/upload")
public String fileUpload(String desc, MultipartFile[] file) {
int count = 1;
System.out.println("文件描述:" + desc);
for (MultipartFile mf : file) {
System.out.println(mf.getContentType()); //获取文件类型
System.out.println(mf.getName());//获取file控件name属性值
System.out.println(mf.getOriginalFilename());//上传的文件名称
System.out.println(mf.getSize());//获取文件大小
try {
InputStream is = mf.getInputStream();
OutputStream os = new FileOutputStream(new File("e:/img" + count + ".jpg"));
int len = -1;
while ((len = is.read()) != -1) {
os.write(len);
}
os.flush();
is.close();
os.close();
count++;
} catch (IOException e) {
e.printStackTrace();
}
return "upload";
}
SpringMVC文件上传方法
@PostMapping("/upload")
public String fileUpload(String desc, MultipartFile[] file) {
int count = 1;
System.out.println("文件描述:" + desc);
for (MultipartFile mf : file) {
System.out.println(mf.getContentType()); //获取文件类型
System.out.println(mf.getName());//获取file控件name属性值
System.out.println(mf.getOriginalFilename());//上传的文件名称
System.out.println(mf.getSize());//获取文件大小
try {
String path = "e:/img/" + mf.getOriginalFilename();
mf.transferTo(new File(path));
} catch (IOException e) {
e.printStackTrace();
}
}
return "upload";
}
2、Spring发送邮件
(1)需要的jar包
mail.jar
spring-context-support.jar
(2)在applicationContext.xml文件配置发送邮件解析器
<!--配置邮件解析器-->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.163.com"/>
<property name="username" value="yang7email@163.com"/>
<property name="password" value="ROBQTYBQTQVSQVNW"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
(3)新建线程发送邮件
@Controller
public class EmailController {
@Autowired
private JavaMailSender javaMailSender;
@GetMapping("/email/send")
public String sendEmail() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("yang7email@163.com");
message.setSubject("Hi,this is spirng mail");
message.setTo("1064289281@qq.com");
message.setText("hi,xixing");
javaMailSender.send(message);
}
});
thread.start();
return "";
}
}
3、拦截器
(1)拦截器和过滤器类似,但是只能拦截到controller请求。
创建拦截器Logininterceptor.java,用户登录后才能请求到使用页面,否则跳转到登录信息页面
//继承自HandlerInterceptorAdapter类
public class LoginInterceptor extends HandlerInterceptorAdapter {
//使用set注入获取uris,不拦截这些路径下的请求,即不用登录也能访问到的controller路径
private List<String> uris;
public void setUris(List<String> uris) {
this.uris = uris;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
//获取登录后存入session中的用户信息
User currUser = (User) session.getAttribute("currUser");
String uri = request.getRequestURI();//获取请求的路径
if(uris.contains(uri)){
return true;
}else{
if(currUser != null){
return true;
}else{
//没有登录时跳转到controller层的提示登录页面
response.sendRedirect("/user/msg");
return false;
/*抛出自定义异常
throw new LoginException();*/
}
}
}
}
(2)在mvc-servlet.xml配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截器作用的路径,/**代表所有-->
<mvc:mapping path="/**"/>
<!--通过set注入方法向拦截器注入uris,请求这些路径下的页面不用拦截-->
<bean class="com.hisoft.interceptor.LoginInterceptor">
<property name="uris">
<list>
<value>/user/login</value>
<value>/user/msg</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
(3)配置异常解析器
可以抛出自定义异常,通过异常解析器来进行重定向
<!--异常解析器-->
<bean id="handlerExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!--通过异常解析器重定向到/user/msg-->
<prop key="com.hisoft.exception.LoginException">redirect:/user/msg</prop>
</props>
</property>
</bean>
4、日志
(1)日志组件有Apache Commons Logging、Log4j、SLF4J、Log4j2等等,这里使用Log4j组件
需要的jar包有 log4j.jar
日志级别从高到低为:fatal→error→warn→info→debug
(2)创建log4j.properties配置文件
#输出器,也就是当前日志输出的位置,ConsoleAppender代表控制台
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#指定输出日志的格式
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
#定义输出日志的格式,\r\n表示回车换行
log4j.appender.A1.layout.ConversionPattern=[%p](%d)---%l--%m\r\n
#定义输出日志的优先级,定义的级别和比定义优先级更高的级别的输出日志都可以输出
log4j.rootLogger=debug,A1
(3)输出格式中特殊符号代表的含义:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式, 比如:%d{yyy MMM dd HH:mm:ss , SSS}
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
(4)Log4jTest.java文件中输出日志信息
//将当前类的映射传入Logger.getLogger方法中
Logger logger = Logger.getLogger(Log4jTest.class);
log.debug("debug message");
log.info("info message");
log.warn("warn message");
log.error("error message");
log.fatal("fatal message");
(5)将日志信息输出到文件中
#日志信息输出到文件
log4j.appender.fout=org.apache.log4j.FileAppender
log4j.appender.fout.layout=org.apache.log4j.PatternLayout
log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m\r\n
#输出的文件的路径
log4j.appender.fout.file=D:/logs/log.log
log4j.rootLogger=fout
(6)以天为单位生成日志文件
#日志信息以天为单位输出到文件
log4j.appender.B=org.apache.log4j.DailyRollingFileAppender
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=[%p](%d)---%l--%m
log4j.appender.B.DatePattern='.'yyyy-MM-dd
log4j.appender.B.file=D:/logs/log.log
log4j.rootLogger=fout
(7)根据日志级别存放的不同的位置
log4j.appender.fout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fout.layout=org.apache.log4j.PatternLayout
log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m\r\n
log4j.appender.fout.DatePattern='.'yyyy-MM-dd
#指定输出等级为INFO
log4j.appender.fout.Threshold=INFO
log4j.appender.fout.file=D:/logs/log.log
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%p](%d)---%l--%m\r\n
log4j.rootLogger=DEBUG, A1,fout
(8)根据包输出日志信息
log4j.appender.fout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fout.layout=org.apache.log4j.PatternLayout
log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m\r\n
log4j.appender.fout.DatePattern='.'yyyy-MM-dd
log4j.appender.fout.file=C:/logs/x.log
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%p](%d)---%l--%m\r\n
#log4j.logger后面加上包名,表示只输出这个包中日志信息
log4j.logger.com.google=ERROR,fout
log4j.rootLogger=DEBUG, A1