day02

作者: 折翼自由 | 来源:发表于2018-07-17 10:13 被阅读0次

    Servlet入门

    1.1Serlvet介绍

    API.png

    文档总结:

    什么是servlet?
    处理请求和响应的java程序。

    怎么创建servlet?
    继承HttpServlet类,在web.xml中配置

    1.2Servlet开发的步骤:(重点)

    1、在cn.igeek.web包下 创建一个类 实现 HttpServlet 类
    2、重写doGet和doPost方法
    package cn.igeek.web.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class DemoServlet
     */
    @WebServlet("/DemoServlet")
    public class DemoServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public DemoServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("doGet....");
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("doPost....");
            doGet(request, response);
        }
    
    }
    
    3、在当前项目中的web.xml文件中配置当前开发好的Servlet程序
    <servlet>
        <!-- servlet的名称 -->
        <servlet-name>DemoServlet</servlet-name>
        <!-- servlet的具体实现类 -->
        <servlet-class>cn.igeek.web.DemoServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <!-- servlet的名称 -->
        <servlet-name>DemoServlet</servlet-name>
        <!-- 访问这个servlet程序的请求路径 -->
        <url-pattern>/DemoServlet</url-pattern>
      </servlet-mapping>
    
    4、发布这个项目,运行服务器,测试
    doGet....
    

    1.31.6获取请求(重点)

    准备HTML

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="/day02/my" method="post">
    用户名:<input type="text" name="username"><br>
    爱    好:<input type="checkbox" name="hobby" value="football">足球
    <input type="checkbox" name="hobby" value="basketball">篮球<br>
    <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

    发送请求,之后要接收,对于提交上了的用户名,爱好,我们必须获取后,才能处理,那么请求参数如何获取?
    使用服务器给我提供的一个对象Request对象!!!!!


    request.png

    获取参数的方法有哪些?

    String getParameter(String name)
                根据name获取对应的值
    Map   getParameterMap()
                参数名作为key,参数值作业value,封装到map中
    String[] getParameterValues(String name)
                获取name相同的所有value 例如复选框
    
    //需求:获取注册页面的值。
    import java.io.IOException;
    import java.util.Map;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class MyServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                          System.out.println("getParameter:"+request.getParameter("username"));
            System.out.println("===============");
            String[] values = request.getParameterValues("hobby");
            for (String string : values) {
                System.out.println("getParameterValues:"+string);
            }
            System.out.println("===============");
            Map<String, String[]> map = request.getParameterMap();
            for(String key : map.keySet()){
                for (String value : map.get(key)) {
                    System.out.println("getParameterMap:"+value);
                }
            }   
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    

    1.4发送响应(重点)

    response.png

    这个对象用于向浏览器发出响应,要使用的方法为:

    java.io.PrintWriter getWriter()
    返回可将字符文本发送到客户端的PrintWriter 对象

    PrintWriter.png

    要使用的方法:
    void write (String s)
    写入字符串
    代码:

    System.out.println("========发出响应===========");
            response.getWriter().write("test OK!!!!");
    

    第2章Servlet开发应用——登录案例(重点)

    2.1需求分析

    图片1.png

    2.2准备工作

    <form action="../login" method="post">
    <table>
        <tr>
            <td>用户名</td>
            <td><input type="text" name="username"/></td>
        </tr>
        <tr>
            <td>密码</td>
            <td><input type="password" name="password"/></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="登录"/></td>
        </tr>
    </table>
    </form>
    

    Debug调试模式界面介绍:
    开启debug模式操作:1 服务器启动必须dubug模式 2 需要查看的位置双击设置断点

    2.2.1最终结构
    图片2.png

    2.3登录servlet

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //获取请求参数(username  password)
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            //开启debug模式操作:1 服务器启动必须dubug模式  2 需要查看的位置双击设置断点
            
            //封装数据到user对象
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            
            //调用service方法,执行用户登陆
            UserService userService = new UserService();
            User loginUser = userService.login(user);
            //根据返回的结果,给出不同提示信息
            if(loginUser == null){
                //用户名或者密码错误,login error
                response.getWriter().write("login error");
            }else{
                //登陆成功,login OK
                response.getWriter().write("login OK");
            }
            
    }
    

    2.4 业务层

    public class UserService {
        private UserDao userDao = new UserDao();
        /**
         * 用户登陆的方法
         * @param user
         * @return
         */
        public User login(User user) {
            return userDao.login(user);
        }
    }
    

    2.5数据层

    public class UserDao {
    
    private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
    public User login(User user) {
        String sql = "select * from user where username = ? and password = ?";
        try {
          return qr.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword());
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException("用户登陆失败");
            }
        }
    }
    

    第3章servlet其他

    3.1Servlet的生命周期(了解)

    生命周期:是说一个对象从创建到销毁的整个过程。称为整个对象的一个生命周期。


    图片3.png

    上图描述了servlet的生命周期。按照功能的不同,大致分为三个阶段,分别是 初始化阶段,运行阶段(最频繁) 和 销毁阶段。
    注意:当服务器关闭的时候,项目中的servlet就调用第8步销毁。

    总结:Servlet 的创建,在用户第一次请求,之后,创建。销毁,是发生在服务器关闭的时候。

    3.1.1初始化阶段

    当客户端向tomcat发送http请求访问servelt程序,tomcat首先会解析请求,检查内存中是否已经有了该servlet对象:
    如果有直接使用对应的servlet对象;
    如果没有就创建servlet实例对象,然后通过调用init() 方法实现Servlet的初始化工作。
    需要注意的是,在整个servlet的生命周期内,init方法只被调用了一次。
    测试:添加了init方法

    public class DemoServlet extends HttpServlet{
    
        @Override
        public void init() throws ServletException {
            System.out.println("DemoServlet....init....");
            super.init();
        }
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("DemoServlet.....doGet....");
        }
        
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {      System.out.println("DemoServlet.....doPost....");
        }
    }
    

    3.1.2运行阶段

    在这个阶段,tomcat服务器会为这个请求 创建 代表HTTP请求的ServletRequest对象 和 代表HTTP响应的 ServletResponse对象,然后将他们作为参数传递给service() 方法。
    servcie() 方法从ServletRequest对象获取请求的信息并做出处理;通过ServletResponse 对象生成响应的结果。
    在servlet的整个生命周期内,对于servlet的每一次访问请求,tomcat都会调用servlet的service方法,并且创建新的ServletRequest对象和ServletResponse对象。也就是说service() 方法会servlet的生命周期内会被调用多次。

    doGet和doPost由service方法调用:在我们写的servlet父类HttpServlet中源码:


    图片4.png

    源码展示:////////////////标记重点////////////////////

    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
    
            String method = req.getMethod();
    /////////////////////////////////////////////
            if (method.equals(METHOD_GET)) {
                long lastModified = getLastModified(req);
                if (lastModified == -1) {
                    // servlet doesn't support if-modified-since, no reason
                    // to go through further expensive logic
                    doGet(req, resp);
    //////////////////////////////////////////////////////            
    } else {
                    long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                    if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                        // If the servlet mod time is later, call doGet()
                        // Round down to the nearest second for a proper compare
                        // A ifModifiedSince of -1 will always be less
                        maybeSetLastModified(resp, lastModified);
                        doGet(req, resp);
                    } else {
                        resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                    }
                }
    
            } else if (method.equals(METHOD_HEAD)) {
                long lastModified = getLastModified(req);
                maybeSetLastModified(resp, lastModified);
                doHead(req, resp);
    
            } else if (method.equals(METHOD_POST)) {
    ///////////////////////////////////////////
                doPost(req, resp);
    ///////////////////////////////////////////
                
            } else if (method.equals(METHOD_PUT)) {
                doPut(req, resp);        
                
            } else if (method.equals(METHOD_DELETE)) {
                doDelete(req, resp);
                
            } else if (method.equals(METHOD_OPTIONS)) {
                doOptions(req,resp);
                
            } else if (method.equals(METHOD_TRACE)) {
                doTrace(req,resp);
                
            } else {
                //
                // Note that this means NO servlet supports whatever
                // method was requested, anywhere on this server.
                //
    
                String errMsg = lStrings.getString("http.method_not_implemented");
                Object[] errArgs = new Object[1];
                errArgs[0] = method;
                errMsg = MessageFormat.format(errMsg, errArgs);
                
                resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
            }
        }
    

    3.1.3销毁阶段

    当服务器关闭时,servlet会随着Web应用的销毁而销毁。
    在销毁serlvet之前,tomcat 会调用Servlet的destory方法,以便让Servlet对象释放他所占用的资源。

    第4章ServletConfig介绍

    应用场景:
    为了将一些灵活需要修改的内容,设置到web.xml中,后期 ,可以在不修改代码的情况下,通过修改配置文件,达到,修改内容的目的


    图片5.png
    图片6.png
    图片7.png

    servlet容器: tomcat(java的web服务器)
    sun公司要求服务器,创建servlet的同时,再去创建一个servletConfig对象. ServletConfig包含了一些Servlet的配置信息.
    再调用servlet的init方法时,将servletCongfig传给servlet
    servletConfig的内容是 是自己定义的. 在web.xml中 的servlet标签下书写servletConfig的内容.

    图片8.png

    ServletConfig它读取某个Servlet的配置信息。
    1、如果servlet需要一些参数. 我们可以在web.xml的servlet标签内进行配置

    图片9.png

    2 tomcat去工作: 读取servlet中init-param这个标签. 把里面的内容封装到ServletConfig中
    3 tomcat去工作: 调用servlet的init方法, 把封装好的 servletConfig对象, 传递给servlet中.
    调用servelt中的init(ServletConfig config)

    private transient ServletConfig config;
    
    public void init(ServletConfig config) throws ServletException{
    this.config=config;
    this.init();
    }
    

    4 如何使用
    获取servletConfig对象, 通过servlet的getServletConfig() 方法

    //获取servletconfig对象
    ServletConfig cfg =this.getServeltConfig();
    

    获取内部的参数值:通过servletConfig.getInitParameter(key)

    //从对象中根据key 获取value
    String company =cfg.getInitParameter("company")
    

    5、重启tomcat,地址栏访问 对应的servlet

    相关文章

      网友评论

          本文标题:day02

          本文链接:https://www.haomeiwen.com/subject/exphpftx.html