Java Servlet 基础使用(一)

介绍

  Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

生命周期

/**
 * class name:${NAME} <BR>
 * class description: TODO <BR>
 * Remark: <BR>
 * servlet的生命周期
 * 1.web容器实例化servlet
 * 2.调用init()方法
 * 3.如果发生了请求 会立刻调用service()方法,根据请求的类型分别选择get或者post方法
 * 4.请求结束,相应结束servlet会销毁 会调用destroy()方法 内存回收
 *
 * url配置
 * 路径
 * 1.全路径匹配 /MyServlet
 * 2.通配符匹配 /xx/*
 * 3.扩展名匹配 *.action  *.go  *.do
 *
 * servletConfig 代码我当前这个servlet的一些配置信息(重要)
 * 每一个servlet都有他自己独特的servletConfig
 *
 */
@WebServlet(name="MyServlet",urlPatterns = "/MyServlet")
public class MyServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init正在被调用");
        super.init(config);
    }

    @Override
    public void destroy() {
        System.out.println("destroy正在被调用");
        super.destroy();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //验证访问servlet的人的用户名和密码
        String username = "xiaowang";
        String password = "123456";

        System.out.println("进入了MyServlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
    }
}

容器

@WebServlet(name = "ContextServlet")
public class ContextServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //javaweb中的三种数据范围 三种容器
        //servletContext 上下文容器 web.xml
        //request 请求的容器
        //session 会话容器

        //都有setAttribute(String key,String value);
        //都有getAttribute(String key);
        //
        ServletContext ctx = this.getServletContext();
        //当前整个项目所有的数据都共享的容器
        //统计在线人数,项目配置的全局数据
        HttpSession session = request.getSession();
        //一次会话中的数据实现共享 一次会话和业务需要关联
        //用于登录存储用户数据,验证用户使用系统的时候有没有登录
        System.out.println(request);
        //一定是一次请求中数据共享
        //用于在进入页面之前先进入后台,用于转发


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

获取请求数据

/**
 * class name:${NAME} <BR>
 * class description: TODO <BR>
 * Remark: <BR>
 */
@WebServlet(name = "LoginServlet",urlPatterns = "/LoginServlet")
public class HeaderServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取单个请求头的信息
        String angent = request.getHeader("User-Agent");
        //获取所有请求头的信息
        Enumeration<String> enu = request.getHeaderNames();
        while (enu.hasMoreElements()){
            String s = enu.nextElement();
            String value = request.getHeader(s);
            System.out.println(s+":"+value);
        }
        
		//通过request获取请求参数
        //1.通过键值对获取单个参数
        // a:参数的key要和请求里面的键值对要匹配
        // b:后台使用的key要和前台表单中的name属性一一对应
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //2.通过键值对获取多个相同的参数
        //前台一定一个key对应多个值
        //前台只要拥有同一个key后台就用这个key去接受,不一定是同一个表单对象
        //checkbox hidden带数组会使用
        String[] hoby = request.getParameterValues("hoby");
        //3.一次性获取所有的参数(重点)
        Map<String,String[]> map =  request.getParameterMap();
        UserBean user = new UserBean();
        try {
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println(user);
        //System.out.println(Arrays.toString(hoby));
        //System.out.println(username + "  " + password);
        System.out.println("进入了LoginServlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

乱码问题

/**
 * class name:${NAME} <BR>
 * class description: TODO <BR>
 * Remark: <BR>
 * 乱码产生的原因 前台 utf-8 后台 utf-8 tomcat ISO-8859-1
 * get请求乱码
 * 1.手动转码 先用ISO-8859-1解码 再用utf-8进行编码
 * 2.修改tomcat的编码方式 在修改端口的那栏增加属性配置 URIEncoding="utf-8"
 * post请求乱码(重点)
 * 1.手动转码 先用ISO-8859-1解码 再用utf-8进行编码
 * 2.一次性设置请求头信息中的编码
 *
 *
 */
@WebServlet(name = "EncodingServlet",urlPatterns = "/EncodingServlet")
public class EncodingServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //只适用于请求体中的参数设置不适用于请求行
        //设置编码一定要放在第一行
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //String name = new String(username.getBytes("ISO-8859-1"),"UTF-8");
        //String pass = new String(password.getBytes("ISO-8859-1"),"UTF-8");
        System.out.println(username+" "+password);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

响应数据


/**
 * class name:${NAME} <BR>
 * class description: TODO <BR>
 * Remark: <BR>
 * 相应response
 *
 */
public class LoginServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置状态码
        //response.setStatus(302);
        //设置相应头
        //text/plain 指定输出的格式为纯文本字符串 text/html指定输出的格式为网页
        //response.setHeader("Content-Type", "text/plain;charset=utf-8");
        //设置字符集编码(重点)
        //request.setCharacterEncoding("utf-8");
        //设置响应体的字符集编码
        response.setContentType("text/html;charset=utf-8");
        //重定向
        //response.setHeader("Refresh", "3;url=http://www.baidu.com");
        //response.sendRedirect("http://www.baidu.com");
        //设置相应到页面的内容
        //字符流 用于相应页面,相应文本
        //response.getWriter()
        //字节流 用于图片,音频,视频
        //response.getOutputStream()
        ServletContext ctx = this.getServletContext();
        String username = ctx.getInitParameter("username");
        System.out.println(username);

        response.getWriter().print("<h1>hello world!</h1>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

转发

/**
 * class name:${NAME} <BR>
 * class description: TODO <BR>
 * Remark: <BR>
 * 转发
 * 1.可以实现页面跳转
 * 2.页面的地址栏不变
 * 3.转发可以转发其他servlet
 * 4.在转发的过程中,只要你不中断这个过程中的所有步骤都共享一个request
 *  (并不是共享同一个变量,共享是同一个容器,数据互通)
 *
 * 同一个请求中数据传递
 * request.setAttribute(key,value);
 * request.getAttribute(key);
 *
 */
@WebServlet(name = "MyServlet",urlPatterns = "/MyServlet")
public class MyServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        request.setAttribute("username",username);
        request.setAttribute("password",password);
        //转发,参数是转发的地址
        request.getRequestDispatcher("HeaderServlet").forward(request,response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

提供下载

/**
 * class name:${NAME} <BR>
 * class description: TODO <BR>
 * Remark: <BR>
 *如果通过a标签下载
 *   1.图片和文件不会下载,而是直接解析
 *   2.文件名如果是中文有可能会出现乱码
 *   3.只能下载除了图片,文本之外的文件(说明书、app等)
 *
 * @author IGEEK)潘杰
 * @version 1.00 2020-04-03 10:17
 */
@WebServlet(name = "FileServlet",urlPatterns = "/FileServlet")
public class FileServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过servlet下载,通过servlet的outputStream进行流的下载
        //response.getOutputStream()
        //文件下载
        /*
        * servletContext 上下文容器的配置(web.xml)
        * servletConfig  我当前这个servlet的配置
        *
        * */
        ServletContext ctx = this.getServletContext();
        String username = ctx.getInitParameter("username");
        //System.out.println(username);
        //1.获取项目的发布的根目录,为了获取文件的路径
        String fileName ="描述.csv";
        String path = ctx.getRealPath("/");
        System.out.println(path);
        File f = new File(path+fileName);
        System.out.println(f);
        //2.获取服务器的资源文件的输入流
        FileInputStream fi = new FileInputStream(f);
        //3.指定response的输出类型(默认输出类型是text/html 网页)
        response.setContentType(ctx.getMimeType(fileName));

        //4.设置文件名称,不支持中文
        //解决文件名是中文的问题(可选,可以自定义文件的名称只要不是中文就可以)
        //处理中文文件名乱码
        String header = request.getHeader("User-Agent");
        if(header.contains("Firefox")){
            //表示当前是火狐
            BASE64Encoder base64Encoder = new BASE64Encoder();
            fileName = "=?utf-8?B?"	+ base64Encoder.encode(fileName.getBytes("utf-8")) + "?=";
        }else{
            //谷歌
            fileName = URLEncoder.encode(fileName,"utf-8");
        }
        System.out.println(fileName);
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        //相应字节流 tomcat会自动调用关闭和刷新方法
        ServletOutputStream os = response.getOutputStream();
        //5.文件复制,将文件的输入流写入到 response的输出流中去
        byte[] arr =new byte[1024];
        int len;
        while((len=fi.read(arr))!=-1){
            os.write(arr, 0, len);
        }
        fi.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

Session与Cookie

@WebServlet(name = "SessionTestServlet",urlPatterns="/SessionTestServlet")
public class SessionTestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //session 服务器存储数据
        //用于服务器各个请求之间的数据共享
        //在同一次会话中实现数据的共享
        //以前如果没有session,会新创建session 如果以前创建过,直接返回之前的
        HttpSession session = request.getSession();
        //以前如果有session 直接获取session,如果没有返回null
        //HttpSession session = request.getSession(false);
        System.out.println(session);
        String id = session.getId();
        System.out.println(id);
        String username = (String)session.getAttribute("username");
        System.out.println(username);
        //session中实现数据共享
        session.setAttribute("username", "xiaowang");
        Cookie c = new Cookie("JSESSIONID",id);
        c.setMaxAge(20000);
        response.addCookie(c);
        //session的原理
        //session是基于cookie技术

        //使session失效的方法
        session.invalidate();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
@WebServlet(name = "MyServlet",urlPatterns = "/MyServlet")
public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //服务器创建cookie
        Cookie cookie = new Cookie("username", "admin");
        //Cookie默认的失效时间 在你会话关闭的时候
        //一个会话 浏览器关闭之前 ,同一种浏览器
        //给cookie设置失效时间
        cookie.setMaxAge(0);
        //删除客户端cookie的办法
        //cookie.setMaxAge(0);
        //设置cookie的路径
        //设置成/表示此cookie在任何网站都可以访问
        //cookie.setPath("/");
        System.out.println(cookie);


        //将cookie交给客户端
        response.addCookie(cookie);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章