zoukankan      html  css  js  c++  java
  • jsp数据交互(一)

     jsp内置对象这里看别人的总结http://www.cnblogs.com/xiaotangtang/p/4943610.html 

    一、jsp中java小脚本
        1.<% java代码段%>
        2.<% =java表达式%>不能有分号
        3.<%!成员变量和函数声明%>
    二、注释
        1.<!--html注释-->客户端可以看到
        2.<%--jsp注释--%>客户端不能看到
    三、jsp页面的的执行过程
        1.客户端请求(输入URL)
        2.服务器
           (1)现将jsp翻译成.java文件(第一次请求)
                如果是第二次请求,并且jsp页面内容未改变
           (2)将java文件编译成.class文件
           (3)执行.class文件
        3.将执行后的结果和html静态内容发送到客户端
        4.断开连接
    四、jsp内置对象
      是由web容器创建的对象,可以直接用,不用再new
         1.out:方法print(文本)向客户端输出内容
         2.request:客户端请求内容
            方法:
                getParameter(“键”),获取客户端提交的单个数据
                getParameterValues(“键”)获取客户端提交的多个数据
                setCharacterEncoding("编码")解决post提交方式的乱码
                getRequestDispatcher("页面"):进行页面转发
          3.response:响应客户端的请求,向客户端输出内容
             方法
             sendRedirect("页面");//进行页面重定向

    六、会话:session
         浏览器与服务器的一次通话(类似一次打电话)
         1.会话跟浏览器是一一对应的
         2.同一个浏览器不同请求是一次会话
         3.不同浏览器就是不同会话
         4.一般用于保存客户端特定的信息(临时)
      session失效:
         1.原则上,浏览器关闭,session就失效(实际过程中不一定)
         2.超过有效期失效
         3.调用invalidate(),立即失效
        方法:
           setAttribute(String key,object value),向session保存数据
           object setAttribute(String key)向session读取数据
           setMaxInactiveIntervals设置有效期
           invalidate()使session失效
           removeAttribute(String key)移除指定的session
    七、inlude指令:将页面信息包含到另一个页面(静态包含)
        <%@ include file="页面"%>
    八、application:应用程序级别的对象
       各个客户端共享的数据
           方法:
              setAttribute(String key ,object value)
              getAttribute(String key)
              getRealPath("虚拟路径");根据虚拟路径获取物理路径
    九、Cookie: 保存特定客户端的信息
        用法:
          1.创建
            Cookie ck=new Cookie(String key,String value)
            ck.setMaxAge("时间"),设置有效时间,不设置默认浏览器关闭时失效
          2.保存
            response.addCookie(ck);
          3.读取cookie
             a.Cookie[]cks=request.getCookies();
             b.遍历
               getName():获取当前cookie的名字(键名)
               getValue():获取当前cookie的值
    十、session与cookie的区别
              session                    cookie
        保存在服务器的内存中         保存在客户端的硬盘上
        保存object类型               保存String类型
        保存临时数据                 保存永久数据
        安全性高                     安全性差
    十一、JavaBean
       是一个java类
       从功能上来说,java类分为:业务类和数据类
       一个java类符合以下要求才是JavaBean:
            1.是一个公有类
            2.有无参的公共的构造方法
            3.属性私有:第一个字母小写
            4.有getter和setter方法
                (方法名格式:get属性名(大写),set属性名(大写))

    Validate:验证
    Context:上下文
    Request:请求  :当前请求(别的请求无效)
    Response:响应
    Redirect:重定向
    Session:会话:当前会话 (可以包含多个请求)在该会话有效期内可以访问
    Application:当前服务器(可以包含多个会话):
    当服务器启动后就会创建一个application对象,被所有用户共享
    page、request、session、application四个作用域对象都有
    setAttribute()和getAttribute()方法
    而且作用域范围越来越大

    1:request对象

    是从客户端向服务器端发出请求,包括用户提交的信息以及客户端的一些信息。request对象是javax.servlet.http.HttpServletRequest类的实现实例。

    request对象封装了浏览器的请求信息,通过request对象的各种方法可以获取客户端以及用户提交的各项请求信息。

    使用request对象获取客户端提交的请求参数的常用方法如下:

    1.String getParameter(String name),获取上一页面所提交的参数值的参数值,并以字符串形式返回指定参数的值,如果参数不存在则返回空值。用于表单、链接或网址栏传递参数时,使用此方法。

    例如,获取客户端name的参数值:

    String name = request.getParameter("name");

    2.String[ ] getParameterValues(String name),获取以相同名称命名的表单组件提交的数据,主要用于获取复选框的值,返回值类型是字符串数组String[ ]

    例如,获取客户端hobby复选框的所有取值:

    String[ ] hobbys = request.getParameterValues("hobby");
           if(hobbys != null)
           {
           out.println("您的爱好有:");
           for(int i=0;i<hobbys.length;i++)
              out.println(hobbys[i]);
           }

    3.void setCharacterEncoding(String encoding),设置字符编码方式,用来解决传递非英文字符所出现的乱码问题。

    对于以post提交的表单数据

    在第一行写:
    request.setCharacterEncoding("UTF-8");

    对于以get提交的表单数据

    提交的数据作为查询字符串被附加到URL 的末端发送到服务器,此时字服务器端调用

    setCharacterEncoding()方法就没有作用了,我们需要得到请求参数值之后,进行编码转换

    String name=request.getParameter("name");

    name=new String(name.getBytes("ISO-8859-1"),"UTF-8"); 
    也可以通过TomCat目录下的conf下的server.xml文件,在<Connector>元素中添加URIEncoding 属性,将它的值设置为“utf-8”

    <Connector

        port="8080"

        protocol="HTTP/1.1"

         reidrectPort="8433"

        URIEncoding ="UTF-8"

    />

    4.RequestDispatcher getRequestDispatcher(String path)----获取请求分配器

    返回一个javax.servlet.RequestDispatcher对象该方法的forward()方法用于 转发请求

    例如,request.setCharacterEncoding("UTF-8");

    实例:使用request对象实现用户注册功能

    zhuce.html源代码如下:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>个人信息注册</title>
     
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="this is my page">
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
       
        <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

      </head>
     
      <body>
        <h1 align="center">个人信息注册</h1>
        <form action="zhuce.jsp" method="post">
            姓名:<input type="text" name="name"><br>
            密码:<input type="password" name="pwd"><br>
            请选择你的职业:
            <input type="radio" name="career" value="农民">农民
         <input type="radio" name="career" value="工人">工人
         <input type="radio" name="career" value="学生" checked>学生
         <input type="radio" name="career" value="教师">教师
         <br>
         你喜欢的城市:
         <select name="city">
           <option value="辽宁省">辽宁省</option>
           <option value="湖北省">湖北省</option>
           <option value="河南省">河南省</option>
           <option value="山东省">山东省</option>
           <option value="江苏省">江苏省</option>
           <option value="湖南省" selected>湖南省</option>
         </select>
         <br>
         请选择你的爱好:
         <input type="checkbox" name="hobby" value="旅游">旅游
         <input type="checkbox" name="hobby" value="看书" checked>看书
         <input type="checkbox" name="hobby" value="游戏">游戏
         <input type="checkbox" name="hobby" value="琴棋书画">琴棋书画
         <br>
         自我介绍:
         <textarea name="intro">自我介绍</textarea>
         <br>
         <input type="submit" name="submit" value="提交">
        </form>
      </body>
    </html>
    zhuce.jsp源代码如下:

    <%@ page language="java" import="java.util.*" contentType="text/html;charset=UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        
       
        <title>个人信息注册</title>
       

      </head>
     
      <body>
        <%request.setCharacterEncoding("UTF-8"); %>
         您的姓名是:<%=request.getParameter("name") %><br>
         您的密码是:<%=request.getParameter("pwd") %><br>
         您的职业是:<%=request.getParameter("career") %><br>
         您喜欢的城市是:<%=request.getParameter("city") %><br>
         您的爱好有:<%String[] hobbys = request.getParameterValues("hobby");
           if(hobbys != null)
           {
           out.println("您的爱好有:");
           for(int i=0;i<hobbys.length;i++)
              out.print(hobbys[i]);
           }
          %>
          <br>
         自我介绍:<%=request.getParameter("intro") %><br>
      </body>
    </html>

    2:response对象
    常用方法:
    void addCookie(Cookie cookie):在客户端添加cookie
    void sentRedirect(String location);重新定位到新的URL
     

    getRequestDispatcher()与sendRedirect()的区别

     

    1.request.getRequestDispatcher()是请求转发,前后页面共享一个request ;
    response.sendRedirect()是重新定向,前后页面不是一个request。

    request.getRequestDispather();返回的是一个RequestDispatcher对象。

    2.RequestDispatcher.forward()是在服务器端运行;
    HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成.
    所以RequestDispatcher.forward()对于浏览器来说是“透明的”;
    而HttpServletResponse.sendRedirect()则不是。

    3.ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径; 而

    ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。因为

    ServletRequest具有相对路径的概念;而ServletContext对象无次概念。

    RequestDispatcher对象从客户端获取请求request,并把它们传递给服务器上的servlet,html或

    jsp。它有两个方法:


    1.void forward(ServletRequest request,ServletResponse response)
    用来传递request的,可以一个Servlet接收request请求,另一个Servlet用这个request请求来产生response。request传递的请求,response是客户端返回的信息。forward要在response到达客户端之前调用,也就是 before response body output has been flushed。如果不是的话,它会报出异常。


    2.void include(ServletRequest request,ServletResponse response)
    用来记录保留request和response,以后不能再修改response里表示状态的信息。

    如果需要把请求转移到另外一个Web App中的某个地址,可以按下面的做法:
    1. 获得另外一个Web App的ServletConext对象(currentServletContext.getContext(uripath)).

    2. 调用ServletContext.getRequestDispatcher(String url)方法。

    eg:ServletContext.getRequestDispatcher("smserror.jsp").forward(request,response);

    http://lanew.blog.ccidnet.com/blog-htm-do-showone-type-blog-itemid-3690834-uid-327434.html

    二者区别:
    response.sendRedirect(url)跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参
    数,如:
    url?id=1.
    request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求
    能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。而
    sendRedirect()会新建request对象,所以上一个request中的数据会丢失。
    更具体来说就是这样的:
    redirect 会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后
    服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的.
    forward 发生在服务器内部, 在浏览器完全不知情的情况下发给了浏览器另外一个页面的response. 这时页面
    收到的request不是从浏览器直接发来了,可能己经用request.setAttribute在request里放了数据.在转到的页
    面可直接用request.getAttribute获得数据。
    最基本的用法就如上了,其他的一些应注意的地方如下:
    跳转方式
    http://localhost:8080/Test应用
    运用forward方法只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以让你重定向到任何
    URL。
    表单form的action="/uu";sendRedirect("/uu");表示相对于服务器根路径。如http://localhost:8080/Test
    用(则提交至http://localhost:8080/uu);
    Forward代码中的"/uu"则代表相对与WEB应用的路径。如http://localhost:8080/Test应用(则提交至
    http://localhost:8080/Test/uu);
    (运用RequestDispatcher接口的Forward)方法
    forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,
    同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过
    response.setAttribute("name",name)来传至下一个页面.
    重定向后浏览器地址栏URL不变.
    只有在客户端没有输出时才可以调用forward方法。如果当前页面的缓冲区(buffer)不是空的,那么你在调用
    forward方法前必须先清空缓冲区。
    "/"代表相对与web应用路径
    RequestDispatcher rd = request.getRequestDispatcher("/ooo");
    rd.forward(request, response);提交至http://localhost:8080/Test/ooo
    RequestDispatcher rd = getServletContext().getRequestDispatcher("/ooo");
    rd.forward(request, response);提交至http://localhost:8080/Test/ooo
    RequestDispatcher rd =getServletContext().getNamedDispatcher("TestServlet");(TestServlet为一个
    <servlet-name>)
    rd.forward(request, response);提交至名为TestServlet的servlet
    如果在<jsp:forward>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,
    这一点应该特别注意。
    另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交
    http://localhost:8080/Test/gw/page.jsp中转发
    <jsp:forward page="OtherPage.jsp"/>在JSP页面被解析后转换成pageContext.forward("OtherPage.jsp");
    "/OtherPage.jsp"提交到http://localhost:8080/Test/OtherPage.jsp
    "OtherPage.jsp"提交到http://localhost:8080/Test/gw/OtherPage.jsp
    (运用HttpServletResponse接口的sendRedirect)方法302
    是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,
    同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.
    假设转发代码包含于注册的servlet-url为/ggg/tt;jsp为/ggg/tt.jsp:
    绝对路径:response.sendRedirect("http://www.brainysoftware.com
    根路径:response.sendRedirect("/ooo")发送至http://localhost:8080/ooo
    相对路径:response.sendRedirect("ooo")发送至http://localhost:8080/Test/ggg/ooo,
    sendRedirect等同于此方式
    response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
    String newLocn = "/newpath/jsa.jsp";
    response.setHeader("Location",newLocn);
    (Meta Refresh)方法200
    这种方法是由HTML提供的,Meta本身就是HTML标签。使用方法是:<meta http-equiv="refresh" content="5;
    url=http://www.dreamdu.com/" />
    相应的java代码
    String content=stayTime+";URL="+URL;
    response.setHeader("REFRESH",content);
    ------------------------------------------------------------------------------------------------
    --------------------------
    使用response.sendRedirect()地址栏将改变
    使用request.getRequestDispatcher().forward(request,response)地址栏中的信息保持不变.
    ------------------------------------------------------------------------------------------------
    --------------------------
    request.setAttribute存的东西
    只用通过方法2跳转 才能在新页取出来

    1.request.getRequestDispatcher()是请求转发,前后页面共享一个request ; 
    response.sendRedirect()是重新定向,前后页面不是一个request。

    2.RequestDispatcher.forward()是在服务器端运行; 
    HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成. 

    3.ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径; 而

    ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。因为

    ServletRequest具有相对路径的概念;而ServletContext对象无此概念。

    RequestDispatcher对象从客户端获取请求request,并把它们传递给服务器上的servlet,html或

    jsp。它有两个方法:


    2.void include(ServletRequest request,ServletResponse response) 
    用来记录保留request和response,以后不能再修改response里表示状态的信息。

    二者区别: 
    response.sendRedirect(url)跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参 
    数,如: 
    url?id=1. 
    request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求 
    能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。而 
    sendRedirect()会新建request对象,所以上一个request中的数据会丢失。 
    更具体来说就是这样的: 
    redirect 会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后 
    服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的. 
    forward 发生在服务器内部, 在浏览器完全不知情的情况下发给了浏览器另外一个页面的响应. 这时页面 
    收到的request不是从浏览器直接发来了,可能己经用request.setAttribute在request里放了数据.在转到的页 
    面可直接用request.getAttribute获得数据。 


     
     
    重定向的重要应用:
     
    使用重定向技术实现超链接的数据传递
    <a href="color.jsp?color=黄色">黄色</a>  
     
    使用超链接进行数据传递时,采用的是get方式提交请求,如果在传递数据中存在中文,就会造成乱码,因为request.setCharacterEncoding("utf-8")只适用于post方法提交 所以可以通过 设置tomcat字符集实现
    当传递多个数据时,可以用&连接
    <a href="color.jsp?color=黄色&id=1">黄色</a>  

    Session
    //设置10分钟后失效
    session.setMaxInactiveInterval(10*60);  
    也可以在项目的web.xml中设置  代码片段如下:
    <session-config>
        <session-timeout>30</session-timeout>       ------这里的单位是分钟  系统默认会话超时是30分钟  0表示失效   -1表示永不超时
    </session-config>
     
    使整个session会话失效:session.invalidate();
    如果只想清空session的某个对象 ,则可以调用session.removeAttribute(String key)方法,将指定的对象从session中清除
    此时session对象仍然有效
    1、概念:Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,session指的是HttpSession类的对象,这个概念到此结束了,也许会很模糊,但只有看完本文,才能真正有个深刻理解。
     
    2、Session创建的时间是:
    JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。
    由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
     
    引申:
    2)、当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:
    Cookie:JSESSIONID=客户端第一次拿到的session ID
    这样,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。这也是session使用的基本原理----搞不懂这个,就永远不明白session的原理。
    下面是两次请求同一个jsp,请求头信息:
    通过图可以清晰发现,第二次请求的时候,已经添加session ID的信息。
     
    3、Session删除的时间是:
    1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
    2)程序调用HttpSession.invalidate()
    3)服务器关闭或服务停止
     
    4、session存放在哪里:服务器端的内存中。不过session可以通过特殊的方式做持久化管理。
     
    5、session的id是从哪里来的,sessionID是如何使用的:当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象,当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会偷偷地将sessionID放置到请求头中,服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者(Servlet)使用。一个会话只能有一个session对象,对session来说是只认id不认人。
     
    6、session会因为浏览器的关闭而删除吗?
    不会,session 存在于服务器内存中

    ServletContext application=this.getServletContext();
                List<User> listUser = (List<User>)application.getAttribute("currentListUser");
                if(listUser == null){
                    listUser = new ArrayList<User>();
                }
                listUser.add(user);
                application.setAttribute("currentListUser", listUser);  
     
     
     
  • 相关阅读:
    头条前端笔试最后一道题
    Node读取和写入json,格式化输出json
    CSS中的未定义行为,浏览器的差异(一)
    18.2.28阿里前端实习生内推面补坑
    18.2.26深信服Web实习生补坑(已拿到offer)
    MySQL Parameter '?…' has already been defined 是什么问题
    C# List<T>的 Find方法、FindLast方法、FindAll方法、FindIndex方法
    C# 对List<T>进行排序
    SQL里 asc和desc的意思
    Visual Studio同步的时候显示 team foundation 错误 系统找不到指定文件夹
  • 原文地址:https://www.cnblogs.com/ct0217/p/9206484.html
Copyright © 2011-2022 走看看