JSP

本文深入探讨JSP技术,涵盖HTTP协议、中文乱码处理、request与response对象操作、重定向与转发区别、session及application对象应用,以及JavaBean在Web开发中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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找到
    304get请求不可用
    305请求必须通过代理来访问
    400请求有语法错误
    401请求需要HTTP认证
    403取得了请求但拒绝服务
    404请求的资源不可用
    405请求所用的方法是不允许的
    406请求的资源只能用请求不能接受的内容特性来响应
    407用户必须得到认证
    408请求超时
    409发生冲突,请求不能完成
    410请求的资源已经不可用
    411请求需要一个定义的内容长度才能处理
    413请求太大,被拒绝
    414请求的URL太大
    415请求的个数被拒绝
    500服务器内部错误,不能服务
    501不支持请求的部分功能
    502从代理和网管接受了不合法的字符
    503HTTP服务暂时不可用
    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才会无效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值