• Servlet3.0的简单使用


    Servlet3.0(WEB3.0)算是比较新的Servlet技术了,对应的JavaEE版本是6,虽然目前最新的版本是3.1,对应版本JavaEE7。我们目前使用的做多的还是Servlet2.5的东西,所以3.0仅做一个了解

    要求

    • MyEclipse10.0或以上版本
    • 发布到Tomcat7.0或以上版本

    概述

    注解代替web.xml配置文件,可以不使用web.xml文件,所以在创建JavaEE6.0版本时,会发现默认不创建web.xml
    对上传的支持,在Servlet2.5中,我们更多的使用第三方的jar来完成上传文件(如commons-fileupload),在3.0中可以不添加其他jar来完成上传文件

    注解代替配置文件

    我们可以先干掉web.xml,注解主要围绕JavaWeb的三大组件(Servlet,Filter,Linstener)

    Servlet类

    我只需要在Servlet类上面添加@WebServlet(urlPatterns="servlet路径") 即可

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebInitParam;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    @WebServlet(urlPatterns="/AServlet", 
    initParams={
        @WebInitParam(name="p1", value="v1"),
        @WebInitParam(name="p2", value="v2")
    },
    loadOnStartup=1
    )
    public class AServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        public AServlet() {
            super();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String userName = (String) request.getParameter("userName");
            if(userName==null||userName.equals("")){
                request.setAttribute("msg", "请先登录");
                request.getRequestDispatcher("/session1/login.jsp").forward(request, response);
            }else{
                if(userName.equalsIgnoreCase("lz")){
                    //登录成功
                    HttpSession session = request.getSession();
                    session.setAttribute("userName", userName);
                    //写入Cookie
                    Cookie cookie=new Cookie("uname", userName);
                    cookie.setMaxAge(60*60);
                    response.addCookie(cookie);
                    
                    response.sendRedirect("/day11/session1/succ1.jsp");    
                }else{
                    //登录失败
                    request.setAttribute("msg", "请先登录");
                    request.getRequestDispatcher("/session1/login.jsp").forward(request, response);
                }
            }
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    这个initParams属性的配置在注解中使用并不是很好,既然在注解中使用,为何不直接点在代码中定义变量参数。但只有urlParrents时,可以忽略这个属性名,直接给个值 :@WebServlet("/AServlet")  ,其实一个Servlet可以配置多个url,不然这个属性单词最后也不会带s,虽然一般我们不这样使用

    Filter

    Filter使用@WebFilter注解,其中也有一个urlParrents属性用来表示需要过滤的资源,这个urlParrents也可以省略

    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    
    @WebFilter(urlPatterns="/*")
    public class AFilter implements Filter {
    
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse repsonse,
                FilterChain chain) throws IOException, ServletException {
            System.out.println("哈哈~,你看到我没有!");
            chain.doFilter(request, repsonse);  //放行
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
            
        }
    
    }

    Listener

    监听器使用@WebListener,监听器的注解不需要属性值

    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    
    
    @WebListener
    public class AListener implements ServletContextListener {
    
    
        public AListener() {
            // TODO Auto-generated constructor stub
        }
    
    
        public void contextDestroyed(ServletContextEvent arg0)  { 
             // TODO Auto-generated method stub
        }
    
        public void contextInitialized(ServletContextEvent arg0)  { 
             // TODO Auto-generated method stub
        }
        
    }

    上传的支持

    上传对表单的要求(所有的上传对前端页面都是这些要求):

    1.     method="post"
    2.     enctype="multipart/form-data",它的默认值是:application/x-www-form-urlencoded
    3.     <input type="file" name="必须给"/>

    我们只需要在Servlet上添加@MultipartConfig注解即可

    当然也可以为@MultipartConfig注解指定属性值,它有四个属性:

    • int filesizeThreshold:指定缓存的大小,当超出这个大小后,文件会保存到磁盘上;
    • String location:指定临时文件的目录;
    • long maxFilesize:指定上传单个文件的大小限制,如果上传的谁的超出了这个大小,那么就会抛出异常;
    • long maxRequestSize:指定整个表单的大小限制。

    当在Servlet上使用了@MultipartConfig注解后,那么就可以使用request.getPart(“fieldName”)来获取<input:file>的内容,其中Part表示一个文件表单项,接着就可以使用Part对象的API

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.Part;
    
    @WebServlet("/CServlet")
    @MultipartConfig
    public class CServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          request.setCharacterEncoding("utf-8");
            //Servlet3.0对文件上传的支持
            String userName = request.getParameter("userName");
            
            Part part = request.getPart("file");
            //获得文件的MIME类型
            System.out.println(part.getContentType());
            //获得文件的字节数
            System.out.println(part.getSize());
            //获得文件字段名
            System.out.println(part.getName());
            //获取文件名
            System.out.println(part.getSubmittedFileName());
            
        //保存图片到硬盘
            part.write("d:/xxx.jpg");
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
  • 相关阅读:
    PS_0005:画带颜色在线条框 按住Alt键复制
    零钱兑换(动态规划)
    倒排索引原理和实现
    集群搭建
    java内部类
    nohup &后台运行脚本
    scala构造函数
    spark数据源读取及读数据原理
    安装redis解决公司linux环境的坑
    61、对于employees表中,给出奇数行的first_name
  • 原文地址:https://www.cnblogs.com/lz2017/p/7199669.html
Copyright © 2020-2023  润新知