• servlet notes1


    【动态网页技术发展】
    cgi(common gateway interface)效率低
    --->asp(html+js+com)扩展难;com开发难度大,一般是微软开发;安全性低;实现企业级功能困难
    --->php(跨平台性良好,多种数据库支持,良好的安全性,免费使用;安装复杂,缺少企业支持) PHP+MySQL+Linux+Apache
    --->jsp=HTML+java片段+jsp语法+js(一次编写,到处运行;良好的跨平台性;多种开发工具支持,jbuilder,NetBeans,Eclipse;强大的可伸缩性,jsp+javabean; 入门难,运行机器配置要高,因为jsp是用class常驻内存的方式运行的,效率高,但是需要占更多内存)

    【B/S】
    优点:开发成本低,管理维护简单,成品升级便利,培训费用低,用户使用方便,出现故障概率小
    缺点:安全性低,客户端受限制,有利于管理用户

    【servlet】java 服务器端小程序
    特点:由服务器端调用和执行;java编写;按照servlet规范开发的;功能强大,几乎可以完成所有网站功能;是jsp基础

    文本编辑器:notepad,uedit32
    集成开发工具:jbuilder,eclipse,editplus,netbean

    【servlet/jsp运行环境】
    浏览器:ie,firefox...
    WEB服务器(管理servlet):Tomcat,bea weblogic,resin...
    数据库:MySQL,access,Oracle...
     
    【Tomcat】
    免费的开源的servlet容器,sun公司大力支持(图)
    功能:1,web服务器  2,jsp容器  3.servlet容器

    从bin/startup启动 这样所有消息都会出现,便如调试。

    【servlet/jsp网络拓扑图】
    开发servlet三种方法:
    1.【实现servlet接口】  2.继承Genericservlet 3.继承httpservlet

    init:该函数用于初始化servlet(类似于类的构造函数),该函数只会被调用一次(当用户第一次访问该servlet时被调用)

    service:用于处理业务逻辑,程序员应该把业务逻辑写在这里。当用户每访问一次该servlet时,都会被调用【ServletRequest req用于获得客户端信息; ServletResponse res用于向客户端返回信息。从res中得到PrintWriter 】

    destroy:销毁servlet实例(释放内存)。1.reload该servlet(webapps)2.关闭TOMCAT 2.关机

    2.【通过继承GenericServlet开发servlet】
    只需要在文件中重写一个service方法。
    【code】:
    package xby;
     
    import javax.servlet.GenericServlet;
    import javax.servlet.*;
    import java.io.*;

    public class HelloGen extends GenericServlet{
     public void service(ServletRequest req,ServletResponse res){
      try{
       PrintWriter pw=res.getWriter();
       pw.println("Hello Gen");
       }
      catch(Exception ex){
       ex.printStackTrace();
       }
      }
     
     }

    3.【继承httpservlet】
    重写doGet ,doPost方法,目前使用最多的方法。
    表单提交数据get请求和post请求的区别:
    (1)安全性get<post get提交的数据会在浏览器的地址栏显示;
    (2)内容大小上看,get<post get提交的数据不能大于2k 而post提交的数据理论上不受限制 ,但是实际上建议不能大于64k;
    (3)请求响应的速度上看:get>post,get要求服务器立即处理请求,而post请求可能形成一个队列请求。
    【code】:
    【表单标签:<form></form>
    功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里】
    package xby;

    import javax.servlet.http.*;
    import java.io.*;

    public class Login extends HttpServlet{
     //处理get请求
     public void doGet(HttpServletRequest req,HttpServletResponse res){
     try{
      //中文乱码
      res.setContentType("text/html;charset=gbk");
      PrintWriter pw=res.getWriter();
      pw.println("<html>");
      pw.println("<body>");
      pw.println("<h1>登陆界面</h1>");
                    //表单提交给哪个servlet
      pw.println("<form action=logincl method=post>");
      pw.println("用户名:<input type=text name=username><br>");
      pw.println("密码:<input type=password name=passwd><br>");
      pw.println("<input type=submit value=login></br>");
      pw.println("</form>");
      pw.println("</body>");
      pw.println("</html>");
     } 
     catch(Exception ex){
      ex.printStackTrace();
     }
     }
     //处理post请求
     public void doPost(HttpServletRequest req,HttpServletResponse res){
     this.doGet(req,res);
     }
    }
    【LoginCL】
    package xby;

    import javax.servlet.http.*;
    import java.io.*;

    public class LoginCL extends HttpServlet{
     //处理get请求
     public void doGet(HttpServletRequest req,HttpServletResponse res){
     try{
      String u=req.getParameter("username");
      String p=req.getParameter("passwd");
      if(u.equals("xby")&&p.equals("123")){
       res.sendRedirect("wel");
       }
      else{
       res.sendRedirect("login");
      }
     } 
     catch(Exception ex){
      ex.printStackTrace();
     }
     }
     //处理post请求
     public void doPost(HttpServletRequest req,HttpServletResponse res){
     this.doGet(req,res);
     }
    }
    【Wel】
    package xby;

    import javax.servlet.http.*;
    import java.io.*;

    public class Wel extends HttpServlet{
     //处理get请求
     public void doGet(HttpServletRequest req,HttpServletResponse res){
     try{
      PrintWriter pw=res.getWriter();
      pw.println("Welcome");
     } 
     catch(Exception ex){
      ex.printStackTrace();
     }
     }
     //处理post请求
     public void doPost(HttpServletRequest req,HttpServletResponse res){
     this.doGet(req,res);
     }
    }

    【同一用户的不同页面如何共享数据】
    1.cookie:服务器在客户端保存用户的信息,比如登录名,密码等,就是cookie

    2.sendRedirect:该方法将信息传送给另一个页面;速度快;但是只能传送字符串;如果传递时中文,你将得到乱码,需要处理一下
    sendRedirect("welcome?username=xby&passwd=123");
    【code】
     try{
      String u=req.getParameter("username");
      String p=req.getParameter("passwd");
      if(u.equals("xby")&&p.equals("123")){
       res.sendRedirect("wel?uname="+u+"&upass="+p);
       }
      else{
       res.sendRedirect("login");
      }
     } 

     public void doGet(HttpServletRequest req,HttpServletResponse res){
     res.setContentType("text/html;charset=gbk");
     String u=req.getParameter("uname");
     String p=req.getParameter("upass");
     try{
      PrintWriter pw=res.getWriter();
      pw.println("Welcome");
      pw.println("用户名:"+u+"密码:"+p);
     } 
    }

    3.隐藏表单:最常用的,也是最简单,但是有时非常有用
    <form action=login>
    <input type=hidden name=a value=b>
    </form>

    4.session:当用户打开浏览器,访问某个网站时,服务器就会在服务器的内存为改浏览器分配一个空间,该空间被这个浏览器独占。
    这个空间就是session空间,该空间中的数据默认存在时间为30Min,你也可以修改。
    功能:1.网上商城中的购物车 2.保存登录用户的信息 3.将某些数据放到session中,供同一用户的各个页面使用 4.防止用户的非法登陆到某个页面。
    可以看作一张表,这张表有2列,每一行就是session的一个属性。每个属性包含2个部分,一个是属性的名字(String),另一个就是它的值(Object)
    1.得到session              HttpSession hs=request.getSession(true);
    2.向session中添加属性      hs.setAttribute(String name,Object val);
    3.从session中得到某个属性  String name=hs.getAttribute(String name);
    4.从session中删除某个属性  hs.removeAttribute(String name);
    a.session中的属性存在时间默认是30Min,可以在con.web.xml中修改,这个时间指的是用户的发呆时间,而不是累计时间;
    b.当某个浏览器访问网站时,服务器会给浏览器分配一个唯一的session id,并以此来区分不同的浏览器(即客户端)
    c.因为session的各个属性要占用服务器的内存,因此软件公司都是在迫不得已的情况下才去使用。
    【code】
    package xby;

    import javax.servlet.http.*;
    import java.io.*;

    public class LoginCL extends HttpServlet{
     //处理get请求
     public void doGet(HttpServletRequest req,HttpServletResponse res){
     try{
      String u=req.getParameter("username");
      String p=req.getParameter("passwd");
      if(u.equals("xby")&&p.equals("123")){
       
       //将验证成功的信息写入session
       //1.得到session
       HttpSession hs=req.getSession(true);
       //修改session的存在时间
       hs.setMaxInactiveInterval(20);
       hs.setAttribute("pass","ok");
       res.sendRedirect("wel?uname="+u+"&upass="+p);
       }
      else{
       res.sendRedirect("login");
      }
     } 
     catch(Exception ex){
      ex.printStackTrace();
     }
     }
     //处理post请求
     public void doPost(HttpServletRequest req,HttpServletResponse res){
     this.doGet(req,res);
     }
    }
    package xby;

    import javax.servlet.http.*;
    import java.io.*;

    public class Wel extends HttpServlet{
     //处理get请求
     public void doGet(HttpServletRequest req,HttpServletResponse res){
     //中文转码
     res.setContentType("text/html;charset=gbk");
     //得到session
     HttpSession hs=req.getSession(true);
     String val=(String)hs.getAttribute("pass");
     if(val==null){
      //非法登陆
      try {
       res.sendRedirect("login");
         }
         catch (Exception ex) {
          ex.printStackTrace();
         }
      
     }
     //接受上一个页面传递的数据
     String u=req.getParameter("uname");
     String p=req.getParameter("upass");
     try{
      PrintWriter pw=res.getWriter();
      pw.println("Welcome");
      pw.println("用户名:"+u+"密码:"+p);
     } 
     catch(Exception ex){
      ex.printStackTrace();
     }
     }
     //处理post请求
     public void doPost(HttpServletRequest req,HttpServletResponse res){
     this.doGet(req,res);
     }
    }
    【code】

    【Servlet中如何操作数据库】注意sql注入
    数据库验证:
    【存在sql注入漏洞】package xby;

    import javax.servlet.http.*;
    import java.io.*;
    import java.sql.*;

    public class LoginCL extends HttpServlet{
     //处理get请求
     public void doGet(HttpServletRequest req,HttpServletResponse res){
     Connection ct=null;
     Statement sm=null;
     ResultSet rs=null;
     try{
      String u=req.getParameter("username");
      String p=req.getParameter("passwd");
      //连接数据库
      Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//驱动包
      //获得连接
      ct=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=xbydb","sa","");//连接数据库的url,数据库的用户名,数据库的密码
      //创建一个Statement
      sm=ct.createStatement();
      rs=sm.executeQuery("select top 1 * from where username='"+u+"'and passwd='"+p+"'");
      
      
      
      if(rs.next()){
       
       //将验证成功的信息写入session
       //1.得到session
       HttpSession hs=req.getSession(true);
       //修改session的存在时间
       hs.setMaxInactiveInterval(20);
       hs.setAttribute("pass","ok");
       res.sendRedirect("wel?uname="+u+"&upass="+p);
       }
      else{
       res.sendRedirect("login");
      }
     } 
     catch(Exception ex){
      ex.printStackTrace();
     }finally{
      try {
       if(rs!=null){
        rs.close();
       }
       if(sm!=null){
        sm.close();
       }if(ct!=null){
        ct.close();
             }
       }
       
         catch (Exception ex) {
          ex.printStackTrace();
         }
     }
     }
     //处理post请求
     public void doPost(HttpServletRequest req,HttpServletResponse res){
     this.doGet(req,res);
     }
    }【】

    【sql注入漏洞修改】
    package xby;

    import javax.servlet.http.*;
    import java.io.*;
    import java.sql.*;

    public class LoginCL extends HttpServlet{
     //处理get请求
     public void doGet(HttpServletRequest req,HttpServletResponse res){
      
     Connection ct=null;
     Statement sm=null;
     ResultSet rs=null;
     
     try{
      String u=req.getParameter("username");
      String p=req.getParameter("passwd");
      
       
      rs=sm.executeQuery("select top 1 passwd from where username='"+u+"'");
      
      if(rs.next())
      {
       //说明用户存在
       String dbpasswd=rs.getString(1);
       
       if(dbpasswd.equals(p))
       {
        //说明用户真的合法
        HttpSession hs=req.getSession(true);
           //修改session的存在时间
           hs.setMaxInactiveInterval(20);
           hs.setAttribute("pass","ok");
           res.sendRedirect("wel?uname="+u+"&upass="+p);
       }
       else
          {
           res.sendRedirect("login");
             }
      }
      else
      {
       res.sendRedirect("login");
         }
      } 
     catch(Exception ex){
      ex.printStackTrace();
     }finally{
      try {
       if(rs!=null){
        rs.close();
       }
       if(sm!=null){
        sm.close();
       }if(ct!=null){
        ct.close();
             }
       }
       
         catch (Exception ex) {
          ex.printStackTrace();
         }
     }
     }
     //处理post请求
     public void doPost(HttpServletRequest req,HttpServletResponse res){
     this.doGet(req,res);
     }
    }
    【数据库程序设计】
    一般通过JDBC(Java Database Connectivity)的驱动程序实现对底层数据库的操作。分三步:
    1.连接数据库
    2.不断执行SQL语句和处理查询结果
    3.关闭连接
    JDBC规定了一套访问数据库的API,具体实现则依赖具体的JDBC驱动程序。

    【获得驱动】:
    Class.forName("驱动程序名"); //Class的完整类名为java.lang.Class 加载了驱动后,就可以开始连接数据库

    【连接数据库】:
    Connection ct=DriverManager.getConnection("url","user","password"); //该成员方法的作用是与指定的数据库建立连接,并返回建立起来的连接。这样java程序就与数据库管理系统建立了传递SQL语句的操作通道。

    【创建SQL语句实例对象】(并进行数据处理):
    Statement st=ct.createStatement();
    ResultSet rs=st.executeQuery("SQL语句");

    【关闭数据库】
    xxx.close();

    【servlet中插入图片】
    在webapps文件夹下,建立一个文件夹image,然后将图片拷贝到文件下。在servlet中添加:<img src="./image/图片名"/>

    【分页技术】
    int pageSize:每页多少页记录
    int pageNow:希望显示第几页
    int pageCount:一共多少页
    int rowCount:一共多少条记录
    【代码实现】

    【Cookies】

    【java中的extends和implements】
     extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承。
     JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了
     比如class A extends B implements C,D,E

    【框架问题初涉】

  • 相关阅读:
    Mesos源码分析(8): Mesos-Slave的初始化
    OpenStack(一)——OpenStack的相关概念
    awk(gawk)文本报告生成器
    echo的色彩处理
    bash命令检测Shell脚本中的语法错误和查看详细执行过程
    Linux命令之cut
    sed流编辑器
    shell中函数的使用
    shell中的shift左移参数命令
    shell中跳出循环语句break和continue
  • 原文地址:https://www.cnblogs.com/boyangx/p/4012152.html
Copyright © 2020-2023  润新知