JSP

JSP小结

HTTP协议是一种无状态协议。一个用户想服务器发出请求(reuqest),然后服务器返回响应(response)

处理request中文乱码

  1. 对信息重新编码

    //先将获取的信息重新编码,将编码的值存到字节数组中,然后将数组转化为字符串
    /**
         * String str=request.getParameter("key");
         * byte[] b=str.getBytes("ISO-8859-1");
         * str=new String(b);
         */
    String str=new String(request.getParameter("sideA").getBytes("ISO-8859-1"));
    
  2. request设置编码

    request.setCharacterEncoding("UTF-8");
    

response对象

  1. contentType属性(page指令设置的contentType)

    当一个用户请求访问jsp页面时,该页面用page指令设置页面的contentType属性的值来响应堆页面的请求

  2. 动态响应contentType

    可以用response.setContentType()动态改变contentType属性

  3. response添加头响应

    如response.setHeader(“Refresh”,“5”);定时刷新

  4. response重定向

    response.sendRedirect("");

  5. response状态行

    服务器对用户请求的相应,如505,404等

    状态代码 代码说明
    101 服务器正在升级协议
    102 用户可以继续
    201 请求成功且在服务器上创建了新的资源
    202 请求已被接受但还没有处理完毕
    200 请求成功
    203 用户端给出的元信息不是发自服务器的
    204 请求成功,但没有新信息
    205 用户必须重置文档试图
    206 服务器执行了部分get请求
    300 请求的资源有多种表示法
    301 资源已经被被永久移动到新位置
    302 资源已经被临时移动到新位置
    303 应答可以在另外一个URL找到
    304 get请求不可用
    305 请求必须通过代理来访问
    400 请求有语法错误
    401 请求需要HTTP认证
    403 取得了请求但拒绝服务
    404 请求的资源不可用
    405 请求所用的方法是不允许的
    406 请求的资源只能用请求不能接受的内容特性来响应
    407 用户必须得到认证
    408 请求超时
    409 发生冲突,请求不能完成
    410 请求的资源已经不可用
    411 请求需要一个定义的内容长度才能处理
    413 请求太大,被拒绝
    414 请求的URL太大
    415 请求的个数被拒绝
    500 服务器内部错误,不能服务
    501 不支持请求的部分功能
    502 从代理和网管接受了不合法的字符
    503 HTTP服务暂时不可用
    504 服务器在等待代理服务器应答时发生超时
    505 不支持请求的HTTP版本

用request和response打开输入流(读)和输出流(写)

  • request.getInputStream()

    ​ request.getInputStream()可以获得一个输入流,可以用来读取用户上传文件的全部信息,包括表单的头信息以及上传文件的内容。

    ​ 如下,前四行以及倒数五行(包括空行)都是表单域的内容,中间部分是文件a.txt的内容:这是一个测试文件。

    1536070718455

  • response.getOutputStream()

    response.getOutputStream()可以获得一个指向用户的输出流,服务器将文件写入这个流,用户就可以通过这个进行文件下载。当提供下载功能时,应当使用response对象向用户发送HTTP头信息,这样用户的浏览器就会调用相应的外部程序打开下载的文件,response通过setHeader方法添加下载头的格式如下:

    response.setHeader("Content-disposition","attachment;filename="+"下载文件名");
    

    谷歌浏览器会弹出如下提示:

    1536071229253

重定向和转发的区别

  1. sendRedirect方法

    response.sendRedirect("目标url");
    

    ​ 重定向方法仅仅将用户从当前页面或者当前servelet定向到另一个JSP页面或servlet,但不能将用户对当前页面或servlet的请求转发给所定向的资源,重定向的目标页面无法使用request获取用户提交的数据。

  2. RequestDispatcher对象

    request.getRequestDispatcher("目标url").forward(request,response);
    

    RequestDispatcher对象可以把用户对当前页面的请求和响应都传递转发到下一个页面

session对象

  1. session对象由Tomcat服务器创建,实现了HttpSession接口。

  2. session对象的生命周期取决于

    1. 是否到达最长"发呆"时间(用户对某个Web目录下的JSP页面发出请求并得到响应,如果用户不再对该Web服务目录发出请求,那么进入"发呆"状态)
    2. 服务器是否关闭
    3. session是否调用了invalidate()方法
  3. 如何保证session对象的唯一性(URL重写)

    ​ session对象是否能和用户建立起一一对应的关系依赖于用户端是否支持Cookie。如果浏览器的Cookie被禁用后,用户在不同网页之间的session对象可能是互不相同的,因为服务器无法将id(session的id)存到客户端,就无法建立session对象和用户的一一对应关系。那么如何保证用户在网站各个页面的session对象是完全相同的呢,可以通过一个方法——URL重写

    //如果从first.jsp页面连接到second.jsp页面,可以通过下面方式
    //-------------------jsp中可以这样写-------------------------------------------------
    <%
    // 它会查看cookie是否存在,如果不存在,在指定的url后添加jsessionid参数
    // 如果cookie存在,它就不会再url后添加任何东西
    	response.encodeURL("请求地址");
    %>
        
    //--------------------servlet中可以这样写--------------------------------------------
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.IOException;
     
    @WebServlet(urlPatterns = "/hello")
    public class MyServlet extends HttpServlet
    {
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
        {
        
            HttpSession session  = req.getSession();
            //下面请求重定向的路径。
            String path = resp.encodeRedirectURL( "/world" );      
            System.out.println( "jsessionId是:" + req.getSession().getId() );   
            String sessionId = req.getSession().getId();
            req.setAttribute( "sessionId",sessionId );
            resp.sendRedirect( path );
            
        }
        
    }
    
  4. 同一个用户在某个Web服务中的session是相同的(cookie开启),同一个用户在不同的Web服务中的session是不同的

application对象

application可以被同一web项目下的任何位置访问,所以可以存放全局变量

例子:用application实现留言功能

<%--
  Created by IntelliJ IDEA.
  User: HengTian
  Date: 2018/9/1
  Time: 19:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>留言</title>
</head>
<body>

    <form action="/example3_pane.jsp" method="post" name="form">
        输入名字:<input type="text" name="peopleName">
        <br>留言标题:<input type="text" name="title">
        <br>留言:<br><textarea name="message" rows="10" cols="36"></textarea>
        <br><input value="提交" type="submit" name="submit">
    </form>
    <br><a href="/example3_show.jsp">查看留言板</a>
</body>
</html>

<%@ page import="java.util.Vector" %><%--
  Created by IntelliJ IDEA.
  User: HengTian
  Date: 2018/9/1
  Time: 20:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%!
        Vector v=new Vector();
        int i=0;
        ServletContext application;
        synchronized void leaveWord(String s){
            application=getServletConfig().getServletContext();
            i++;
            v.add("No"+i+","+s);
            application.setAttribute("Mess",v);
        }
    %>
    <%
        request.setCharacterEncoding("UTF-8");
        String name=request.getParameter("peopleName");
        String title=request.getParameter("title");
        String message=request.getParameter("message");
        if(name==null||name=="")
            name="guest"+(int)(Math.random()*10000);
        if(title==null||title=="")
            title="无标题";
        if(message==null||message=="")
            message="无信息";
        String s=name+"#"+title+"#"+message;
        out.println(s);
        leaveWord(s);
        %>
        <script type="text/javascript">
            alert("信息提交成功!");
        </script>
    <%
        //response.sendRedirect("example3_input.jsp");
    %>
    <a href="example3_input.jsp">返回</a>
</body>
</html>
<%@ page import="java.util.Vector" %><%--
  Created by IntelliJ IDEA.
  User: HengTian
  Date: 2018/9/1
  Time: 20:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        Vector v= (Vector) application.getAttribute("Mess");
        for(int i=0;i<v.size();i++){
            String s=(String)v.elementAt(i);
            //s=new String(s.getBytes("UTF-8"));
            String[] a=s.split("#");
            out.println("留言人:"+a[0]);
            out.println("标题:"+a[1]+"<br>");
            out.println("信息:"+a[2]+"<br>");
            out.println("--------------------------"+"<br>");
        }
    %>
</body>
</html>

结果:

/example3_input.jsp

1535806831003

/example3_pane.jsp

1535806919227

/example3_show.jsp

1535807007870

JavaBean

  1. bean的有效范围

    • page

      scope取值为page的bean只在当前页面有效,直到页面执行完毕

    • session

      scope取值为session的bean在一个用户所访问的所有页面都是相同的一个,在此期间,对bean的修改会影响其他界面的bean值,但是不同用户不会这样

    • request

      scope取值为request的bean的存活时间略长于page,request范围的bean在响应结束后才无效

    • application

      scope取值为application的bean对于所有用户都是相同的一个,修改时会相互影响,直到服务器关闭,application范围的bean才会无效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章