码歌教育吧 关注:16贴子:1,005

#每天学习打卡# 今日起,每天一点学习内容

取消只看楼主收藏回复

很简单,从今天开始做一个帖子关于自己每日学习的内容。作为自己成长的见证,也作为心境的轨迹。
直接开始吧


IP属地:山西1楼2019-03-04 16:49回复
    时间:2019.03.04
    今日主题是关于学习servlet的时候,第一个登录页面的学习。
    先说明一下基础,Javase部分有过接触,不能说很熟但起码的是会的。然后是web方向关于前端的一些内容也有学习,另还有数据库和JDBC也学习了。
    在这一个基础之上,开始接下来的内容。
    1、创建一个web项目(使用工具Eclipse),项目名称01-Login,别名为login。
    2、创建包com.mage.servlet,创建一个访问的页面用来登录(jsp未学习,这里用原始的模拟来做),创建servlet起名叫PageServlet,别名page。主体大致内容:(纯手写打印个简单登录页面)

    3、创建LoginServlet,别名login。(将在page页面获得的信息全部传给当前login的servlet)


    IP属地:山西2楼2019-03-04 17:04
    回复
      4、使用了mvc思想去做分层。创建业务层对象来处理数据。

      创建com.mage.service包,并编写LoginService内容,即接口,作用用来检验登录的信息。具体代码为:
      public interface LoginService {
      User CheckLogin(String uname,String pwd);
      }
      其中User为实体类,所以创建我们的com.mage.pojo包,并编写实体类User,其中属性包含最基本的uid,uname及pwd。
      接下来创建com.mage.service.impl包,并编写类LoginServiceImpl实现LoginService接口,覆写其中方法。
      5、创建Dao层,连接数据库进行用户信息查询操作。
      方式和业务层类似,唯一在Dao层的实现类中方法需要使用原始的JDBC来操作。具体代码:
      @Override
      public User CheckLoginDao(String uname, String pwd) {
      //声明JDBC对象
      Connection conn = null;
      PreparedStatement ps = null;
      ResultSet rs = null;
      //声明数据存储对象
      User u = null;
      try {
      //加载驱动
      Class.forName("com.mysql.jdbc.Driver");
      //获取连接对象
      conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/0301", "root", "1234");
      //创建sql命令
      String sql = "select * from t_user where uname=? and pwd=?";
      //创建sql命令对象
      ps = conn.prepareStatement(sql);
      //给占位符赋值
      ps.setString(1,uname);
      ps.setString(2, pwd);
      //执行
      rs = ps.executeQuery();
      //遍历执行结果
      while(rs.next()){
      u = new User();
      u.setUid(rs.getInt("uid"));
      u.setUname(rs.getString("uname"));
      u.setPwd(rs.getString("pwd"));
      }
      //关闭资源
      } catch (Exception e) {
      e.printStackTrace();
      }finally{
      try {
      rs.close();
      } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      try {
      ps.close();
      } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      try {
      conn.close();
      } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      }
      //返回
      return u;


      IP属地:山西3楼2019-03-04 17:13
      收起回复
        这就是今日在练习登录页面的时候,学习的内容。没有一五一十的完整步骤写出来,仅是作为自己复习整理的记忆点。


        IP属地:山西4楼2019-03-04 17:39
        回复
          第二个知识点:request作用域
          上步骤已经实现了请求转发的效果,现在的问题是,用户看不到效果不知道是什么原因。所以,应该给用户提示信息。
          关键点:在第一个servlet处理完请求数据之后,可以给request中添加信息(比如处理建议),然后又转给第二个servlet,第二个servlet有同样的操作。
          操作细节:第二个servlet(LoginServlet)在响应数据的时候,在request对象中添加一个信息str :用户名或者密码错误。交给第一个servlet(PageServlet)来获取并响应。
          代码:在请求转发之前添加信息
          //给request中添加处理的信息
          req.setAttribute("str", "用户名或者密码错误");
          在PageServlet中获取添加的信息str
          //获取请求转发过程中处理请求添加的信息
          String str = (String) req.getAttribute("str")
          然后在响应页面时,添加此信息到页面。


          IP属地:山西6楼2019-03-05 09:31
          回复
            小的处理点:因为添加了str,在用户第一次访问PageServlet的时候,页面会显示“null”,因为第一次request中并没有“str”。所以,需要判断一下来进行显示。最简单的方法,用三目运算符来实现。
            String str = (String) req.getAttribute("str")==null?"":(String) req.getAttribute("str");
            这样,就可以轻松解决显示的问题了。


            IP属地:山西7楼2019-03-05 09:33
            回复
              第二个知识点:cookie的使用
              问题:在使用重定向的时候,相当于两个不同的发送请求,发送给了servlet,然而第二次的请求中已经没有了初始的数据,怎么办。使用session技术,又session是依赖于cookie的,所以现在先学一下cookie
              内容:cookie是在浏览器端的,也就是客户端。一般存放在运行的浏览器内存中,如果关闭了浏览器,即消失。如果设置了cookie的有效时间,将存放在硬盘中,关闭浏览器也不会消失。
              代码:
              //创建cookie对象
              Cookie c = new Cookie("key","mage");
              //添加cookie信息
              resp.addCookie(c);
              设置cookie
              设置有效期
              c.setMaxAge(int seconds);
              设置有效路径
              c.setPath(String path);


              IP属地:山西8楼2019-03-05 16:15
              回复
                时间:2019.03.06
                功能:使用cookie实现模拟三天免登录。
                步骤:1、回归到之前练习登录的项目。
                2、重新创建一个servlet用来检验用户请求是否携带cookie,叫作cookieservlet。而不再原来的登录页面PageServlet中写,是为了让servlet职责明确,所以重新创建一个servlet,专门用来作为cookie的验证。
                3、流程:在检验cookie的servlet中判断是否有cookie信息,若是没有直接请求转发到login页面。如果有,开始判断cookie信息是否正确


                IP属地:山西9楼2019-03-06 17:08
                回复
                  4、创建的cookieservlet中具体代码:
                  //检验cookie信息
                  Cookie[] cks = req.getCookies();
                  //判断是否含有cookie信息
                  if(cks!=null){
                  String uid = "";
                  //遍历cookie信息 检验cookie是否包含正确的信息
                  for(Cookie c:cks){
                  if("uid".equals(c.getName())){
                  uid = c.getValue();
                  }
                  }
                  System.out.println(uid);
                  //严谨些再判断
                  if("".equals(uid)){
                  //请求转发
                  req.getRequestDispatcher("page").forward(req, resp);
                  return;
                  }else{
                  //检验用户的uid信息,需要到dao层查询数据库
                  //创建业务层对象
                  LoginService ls = new LoginServiceImpl();
                  User u = ls.checkUidService(uid);
                  if(u!=null){
                  //重定向到主页面
                  resp.sendRedirect("/login/main");
                  return;
                  }else{
                  //请求转发
                  req.getRequestDispatcher("page").forward(req, resp);
                  return;
                  }
                  }
                  }else{
                  //请求转发到登录页面
                  req.getRequestDispatcher("page").forward(req, resp);
                  return;
                  }
                  }


                  IP属地:山西10楼2019-03-07 11:13
                  回复
                    其中有基础注意点,逻辑流程中
                    先判断是否有cookie信息,如果没有直接请求转发到登录页面;如果有,接下来获取cookie信息,然后遍历所有,查询是否有uid的信息,cooki信息很多,只查询uid的。将查询到的uid信息赋值给我们生命的uid变量,然后再进行一次判断,判断拿到的uid信息是否为空,为空直接请求转发,如果不没空,再判断是否和数据库中信息一致,所以需要到业务层处理数据,再到dao层查询数据。


                    IP属地:山西11楼2019-03-07 11:17
                    回复
                      时间:2019.03.08
                      今日主题:session的学习
                      作用:之前学过的request,能帮我们解决同一个请求,不同servlet之间数据共享的问题。如果想解决同一个用户,不同请求之间数据共享的问题怎么办?
                      解决:使用session
                      原理:第一次用户登录请求之后,服务器会创建session对象,用来封装用户的信息,并且把JSESSIONID使用cookie技术给浏览器存放。当用户发起第二次请求的时候,请求信息中会携带JSESSIONID,服务器在接收到请求之后,调用对应的servlet,同时根据JSESSIONID返回其对应的session对象。


                      IP属地:山西12楼2019-03-08 10:52
                      回复
                        总结:session是依赖Cookie技术的服务器端数据存储技术。
                        由服务器进行创建
                        每个用户独立拥有一个session对象
                        默认存储时间为30分钟
                        流程:
                        创建session对象
                        将数据存储到session对象
                        获取session对象
                        从session对象中获取数据(如果session中没有数据,返回为null)
                        注意:只要浏览器不关闭,且在session不失效的情况下,同一个用户的任意请求在项目的任意servlet中获取到的都是同一个session对象。


                        IP属地:山西13楼2019-03-08 10:56
                        回复
                          时间:2019.03.09
                          内容:jsp
                          缘由:之前学习的servlet,帮我们把处理的内容打印到了网页。其实我们写的就是java代码,只不过是看着像html代码,实际上就是用io的方式把字符串打印出来,浏览器识别之后,以网页的形式给我们显示。
                          优势:动态的网页技术,可以从后台获取数据,动态拼接内容,不再是死的固定的内容。
                          劣势:编码的时候非常麻烦,当再添加css和js的时候,会很麻烦。
                          解决:jsp


                          IP属地:山西14楼2019-03-09 10:16
                          回复
                            本质:jsp就是一个简单的servlet设计
                            优势:保留了servlet中编码逻辑代码的方便,同时让写响应处理的代码编写像写html一样简单。


                            IP属地:山西15楼2019-03-09 10:23
                            回复
                              jsp文件的执行过程:
                              如访问当前的项目:localhost:8080/jsp/1.jsp
                              localhost和端口号8080,帮我们锁定了webapps下的项目,寻找jsp项目。接下来的1.jsp并不是去执行它,因为服务器只认识servlet,这里会把1.jsp当做一个servlet的别名,去web.xml中的配置文件去匹配。当前项目中没配置,就到tomcat的web.xml文件中查看。
                              其中有一段代码
                              <!-- The mappings for the JSP servlet -->
                              <servlet-mapping>
                              <servlet-name>jsp</servlet-name>
                              <url-pattern>*.jsp</url-pattern>
                              <url-pattern>*.jspx</url-pattern>
                              </servlet-mapping>
                              所有的jsp文件都去执行名为jsp的servlet,而名为jsp的代码
                              <servlet>
                              <servlet-name>jsp</servlet-name>
                              <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
                              都是去执行JspServlet这一个servlet。
                              相当于把我们写的1.jsp转成servlet


                              IP属地:山西16楼2019-03-09 10:44
                              回复