学习日志day52(2021-09-22)(1、SpringMVC文件上传 2、Spring发送邮件 3、拦截器 4、日志 )

学习内容:学习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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值