javaweb学习

 

  •  Servlet

    1. 什么是Servlet:用于开发动态web的一门技术

    2. 创建HelloServlet

      1. 建立一个Maven项目 
      2. 导入需要的jar包  
        <dependencies>
                <dependency>
                    <groupId>javax.servlet.jsp</groupId>
                    <artifactId>jsp-api</artifactId>
                    <version>2.2</version>
                </dependency>
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>javax.servlet-api</artifactId>
                    <version>4.0.1</version>
                </dependency>
        </dependencies>
      3. 创建HelloSerlvet类并继承HttpServlet 重写doGet和doPost方法
        public class HelloServlet extends HttpServlet {
            //doGet与doPost方法都能够接受浏览器的请求,两者区别在于
            //get :请求能够携带的参数比较少,大小有限制 不安全 但高效
            //post :请求能够携带的参数比较多,大小没有限制 安全 不高效
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                System.out.println("进入了deGet()方法");//后台检测是否进入了doGet()方法
                PrintWriter writer = resp.getWriter();//相应流,对浏览器输出一个流
                writer.println("HelloServlet!!");
            }
        
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                super.doPost(req, resp);
            }
        }
      4. 配置Tomcat
      5. 在web.xml中配置Servlet的映射
        <!-- 注册Servlet类 -->
            <servlet>
                <servlet-name>hello</servlet-name>
                <servlet-class>com.twilight.servlet.HelloServlet</servlet-class>
            </servlet>
            <!-- servlet映射 -->
            <!-- 在浏览器输入 /hello 后会根据此配置走找到hello的处理类com.twilight.servlet.HelloServlet -->
            <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello</url-pattern>
            </servlet-mapping>
      6. 启动Tomcat
    3. servlet原理

    4. srevlet-mapping(servlet映射)

      1. 一个Servlet可以指定一个、多个、默认映射路径
        <!-- servlet映射 -->
            <!-- 在浏览器输入 /hello 后会根据此配置走找到hello的处理类com.twilight.servlet.HelloServlet -->
            <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello</url-pattern>
            </servlet-mapping>
            <!-- 多个请求可以访问HelloServlet -->
            <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello1</url-pattern>
            </servlet-mapping>
            <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello2</url-pattern>
            </servlet-mapping>
            <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello3</url-pattern>
            </servlet-mapping>
            <!-- 任意的请求都可以访问HelloServlet -->
            <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello/*</url-pattern>
            </servlet-mapping>
      2. 指定前缀、后缀
      3. 优先级问题:会先走指定的路径,如果找不到指定的路径,就会走默认路径
    5. ServletContext对象 Servlet上下文对象 以及HttpServletResponse HttpServletRequest 的各个方法熟悉

      1. ServletContext为各个Servlet之间的属性的传输提供了一种方法,各个Servlet都可以创建同一个ServletContext对象,并可以将自己的默写属性传进ServletContext对象,然后其他的Servlet就通过创建该对象获取该属性。
      2. HelloServlet通过ServletContext对象传入username属性
        public class HelloServlet extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                System.out.println("进入了doGet方法");
                String username = "杜锋";
                ServletContext context = this.getServletContext();
                context.setAttribute("username",username);//将一个数据保存在ServletContext中
            }
        }
      3. 该Servlet通过ServletContext对象获得HelloServle的username属性并映射到浏览器
        public class GetServet extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                ServletContext context = this.getServletContext();
                String name = (String)context.getAttribute("username");
        
                resp.setContentType("text/html");
                resp.setCharacterEncoding("utf-8");
                resp.getWriter().print("名字" + name);
            }
        
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                doGet(req, resp);
            }
        }
      4. 当然以上两个类都需要注册并映射
        <servlet>
                <servlet-name>hello</servlet-name>
                <servlet-class>com.twilight.servlet.HelloServlet</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello</url-pattern>
            </servlet-mapping>
        
            <servlet>
                <servlet-name>getc</servlet-name>
                <servlet-class>com.twilight.servlet.GetServet</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>getc</servlet-name>
                <url-pattern>/getc</url-pattern>
            </servlet-mapping>
      5. ServletContext的应用
        1. 获取初始化参数方法 getInitParameter();
          //测试getInitParameter()方法获取初始化的参数
          public class GetParameterServlet extends HttpServlet {
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  ServletContext servletContext = this.getServletContext();
                  servletContext.getInitParameter("url");
                  resp.getWriter().print(servletContext);
              }
          
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                 doGet(req, resp);
              }
          }
        2. 请求转发 getRequestDispatcher()
          /测试请求转发
          public class GetRequestDispatcherServlet extends HttpServlet {
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  ServletContext context = this.getServletContext();
                  context.getRequestDispatcher("/hello").forward(req,resp);
          
              }
          
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  doGet(req, resp);
              }
          }
        3. getResourceAsStream()方法获取类资源
          //测试getResourceAsStream()方法获取类资源
          public class GetResourceAsStreamServlet extends HttpServlet {
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  ServletContext context = this.getServletContext();
                  InputStream is = context.getResourceAsStream("/WEB-INF/classes/demo.properties");
                  Properties prop = new Properties();
                  prop.load(is);
                  String name = prop.getProperty("username");
                  String pwd = prop.getProperty("password");
                  resp.getWriter().print(name + ":" + pwd);
              }
          
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                doGet(req, resp);
              }
          }

          以上各类均需注册和映射,再次没有写出

        4. 重定向 重定向与请求转发的区别  相同点:都可以实现页面的跳转   不同点:1、重定向会跳转url地址,而请求转发不会跳转url地址  2、resp.sendRedirect("/r/target");  req.getRequestDispatcher("/success.jsp").forward(req,resp);

          public class RedirectServlet extends HttpServlet {
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  resp.sendRedirect("/r/target");
              }
          
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                 doGet(req, resp);
              }
          }

           用户登录页面一般会使用重定向

          public class LoginServlet extends HttpServlet {
              @Override
              protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  System.out.println("进入了loginServet");
                  String username = req.getParameter("username");
                  String password = req.getParameter("password");
                  System.out.println(username+ ":" +password);
          
                  resp.sendRedirect("/r/target");
              }
          
              @Override
              protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                 doGet(req, resp);
              }
          }
          <html>
          <body>
          <h2>Hello World!</h2>
          
          <%-- action表示提交路径,需要找到项目的路径 --%>
          <%-- ${pageContext.request.getContextPath()}代表当前项目下 --%>
          <form action="${pageContext.request.getContextPath()}/login" method="get">
              用户名:<input type="text" name="username"><br>
              密码:<input type="password" name="password"><><br>
              <input type="submit">
          </form>
          </body>
          </html>
    6. request应用  
      1.   先认识两个方法
        String password = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");
        public class LoginServlet extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                resp.setCharacterEncoding("UTF-8");
                req.setCharacterEncoding("UTF-8");
                String username = req.getParameter("username");
                String password = req.getParameter("password");
                String[] hobbys = req.getParameterValues("hobbys");
                System.out.println("=======================");
                System.out.println(username);
                System.out.println(password);
                System.out.println(Arrays.toString(hobbys));
                System.out.println("=======================");
        
                //通过请求转发
                req.getRequestDispatcher("/success.jsp").forward(req,resp);
            }
        
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                doGet(req, resp);
            }
        }

         

    7.   cookies讲解  session 讲解
      1. cookie和session有什么用:我们在从客户端进入服务器,会获得一个标记(cookie),或在服务器上填写一个记录(session),来告诉服务器访问的对象是你,从而实现个人的网页生成,可以把cookie和session理解成“信物”,每次访问服务器时,服务器会认得时你。
      2. cookie
        //未运行成功,未解决!!报500错误,cookie不能及时刷新,并且输出乱码
        public class CookieDemo01 extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                System.out.println("进入了CookieDemo01");
                //服务器告诉你来到的时间,并将其封装成一个Cookie给你,你下次来,通过Cookie这个“信物”,就可以知道是你来了
                //解决中文乱码
                req.setCharacterEncoding("UTF-8");
                resp.setCharacterEncoding("UTF-8");
        
                PrintWriter out = resp.getWriter();
        
                //服务器从客户端获取Cookie
                //返回的是数组,说明cookie可以有多个
                Cookie[] cookies = req.getCookies();
                if(cookies != null) {
                    out.print("您第一次访问的时间是");
                    for(int i = 0;i<=cookies.length; i++){
                        Cookie cookie = cookies[i];
                        if(cookie.getName().equals("lastLoginTime")){
                            //如果
                            String value = cookie.getValue();
                            long lastLoginTime = Long.parseLong(value);
                            Date date = new Date(lastLoginTime);
                            out.print(date.toLocaleString());
                        }
                    }
                }else {
                    out.write("这是您第一次进入网站");
                }
        
                //服务器给客户端相应一个cookie
                //System.currentTimeMillis()+""获取当前时间并返回成字符串类;
                Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
                resp.addCookie(cookie);
        
            }
        
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                doGet(req, resp);
            }
        }

         

      3. session(重点)
        //session在浏览器开启时就创建好,关闭时就注销
        //每开启一个一个浏览器会自动生成一个session
        public class SessionDemo01 extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                //解决乱码问题
                req.setCharacterEncoding("UTF-8");
                resp.setCharacterEncoding("UTF-8");
                resp.setContentType("text/html;charset=utf-8");
                //得到session
                HttpSession session = req.getSession();
                //给session中存东西
                session.setAttribute("name",new Person("杜锋",20));
                //获取session的id
                String sessionId = session.getId();
                //判断session是不是新建的
                if(session.isNew()){
                    resp.getWriter().write("创建成功 id:" + sessionId);
                }else {
                    resp.getWriter().write("session已经在服务器中存在了 id:" + sessionId);
                }
        
                //session创建事做了什么事
        //        Cookie cookie = new Cookie("JSESSION",sessionId);
        //        resp.addCookie(cookie);
        } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

         

        //跨Servlet获取Session里的对象,类比ServletContext
        public class SessionDemo02 extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                //解决乱码问题
                req.setCharacterEncoding("UTF-8");
                resp.setCharacterEncoding("UTF-8");
                resp.setContentType("text/html;charset=utf-8");
                //获得session
                HttpSession session = req.getSession();
                Person person = (Person) session.getAttribute("name");
                System.out.println(person.toString());
            }
        
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
               doGet(req, resp);
            }
        }
        //手动注销session
        public class SessionDemo03 extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                HttpSession session = req.getSession();
                session.removeAttribute("name");//移除session里的一个对象数据
                session.invalidate();//注销session,意味着sessionId将会别注销,但立马会生成一个新的session
            }
        
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
               doGet(req, resp);
            }
        }

         

      4. cookie与session的区别
        1. cookie判断你是否来过的原理是通过给你一个cookie,你下次访问网站时会带上cookie,服务器就会根据这个cookie识别你。而session判断则是在你访问服务器时,在服务器上记录一个sessionId和session数据,然后只返回你一个sessionId(sessionId返回的实现原理就是cookie),但session里的数据不会返回,而是记录在服务器上。
        2. session里可以存对象,而cookie里只能存字符。
posted @ 2020-09-01 17:21  TwilightDF  阅读(87)  评论(0)    收藏  举报