[Java Web] JSP

一、简述

JSP是一种动态网页技术标准,其本质就是Servlet。

JSP文件在用户第一次请求时会被编译成Servlet,之后再由该Servlet处理用户的请求。

二、基础

<!-- 声明 -->
<%!
    String scheme;
    String serverName;
    int serverPort;
%>

<!-- 代码段 -->
<%
    scheme = request.getScheme();
    serverName = request.getServerName();
    serverPort = request.getServerPort();
%>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<%=scheme%><br/>
<%=serverName%><br/>
<%=serverPort%><br/>
<%=String.format("%s://%s:%d/", scheme, serverName, serverPort)%>
</body>
</html>

编译指令用于设计JSP程序的属性以及生成的Servlet的属性。

  • page指令用于设置JSP页面的属性和功能。
  • include将外部文件包含至此JSP页面中。
  • taglib允许使用用户自定义的标签。

动作是一组内置标签,用于控制JSP的行为。

  • <jsp:include>用于运行时包含文件。
  • <jsp:forward>用于重定向到其他页面。
  • <jsp:param>用于提供参数。

//index.jsp
<jsp:include page="result.jsp">
    <jsp:param name="number" value="100"/>
</jsp:include>

//result.jsp
<%
    String str = request.getParameter("number");
    int number = Integer.parseInt(str);
    int result = 0;
    while (number != 0) {
        result += number;
        number--;
    }
    out.print(result);
%>

JSP页面在执行时会出现两类异常:

  • JspError:JSP文件转换为Servlet时出现的编译错误。
  • JspException:处理请求时由于逻辑错误而出现的异常。

三、内置对象

内置对象简述:

  • request:javax.servlet.HttpServletRequest接口实现的对象,代表从客户端发送的请求,使用该对象可获取客户端的信息以及用户提交的数据。每次请求都会产生request实例。
  • respone:javax.servlet.HttpServletRespone接口实现的对象,用于响应客户端请求并向客户端输出信息。每次响应都会产生respone实例。
  • session:javax.servlet.HttpSession接口实现的对象,服务器为每个用户浏览器创建单独的session实例,在需要保存用户数据时服务端可将数据写入session中,用户端从session中读取。
  • application:java.servlet.ServletContext接口实现对象,用于在多用户之间保存数据,作用范围是从服务器开始运行到服务器关闭。
  • page:本质上是转换后的Servlet,可调用所有Servlet类所定义的方法。
  • pageContext:提供了获取其他内置对象的方法。
  • config:提供了获取服务器配置信息的方法。
  • exception:用于页面发生错误时做出相应处理。

//index.jsp
<form action="session.jsp" method="post">
    <table align="center">
        <tr>
            <td align="center">用户:</td>
            <td align="left">
                <input type="text" name="user"/>
            </td>
        </tr>
        <tr>
            <td align="center">密码:</td>
            <td align="left">
                <input type="password" name="pass"/>
            </td>
        </tr>
        <tr>
            <td align="center">
                <input type="submit" value="登陆"/>
            </td>
        </tr>
    </table>
</form>

//session.jsp
<%
    session.setMaxInactiveInterval(60);//最大有效时间
    String user = request.getParameter("user");
    String pass = request.getParameter("pass");
    user = new String(user.getBytes("ISO-8859-1"), "UTF-8");//防止中文乱码
    pass = new String(pass.getBytes("ISO-8859-1"), "UTF-8");

    session.setAttribute("user", user);
    session.setAttribute("pass", pass);
    response.sendRedirect("message.jsp");
%>

//message.jsp
<%
    out.println("Session Id:" + session.getId());
    out.println("UserName:" + session.getAttribute("user"));
    out.println("Password:" + session.getAttribute("pass"));
%>

Http是一种无状态协议,只负责请求与响应而不对客户端进行区分。Session跟踪用于区分客户端,主要的方式如下

  • URL重写:在URL地址中添加数据用于标识session。即使用户关闭了Cookie也可以使用这种方式,但是因数据容易暴露而存在安全隐患。
  • 隐藏表单:服务器发送隐藏的HTML表单字段和唯一的session会话编号,以保持服务器对不同用户的追踪。用户查看网页源码时可隐藏字段的属性,存在安全漏洞。
  • Cookie:通过访问用户磁盘上的Cookie文件来识别用户,用户再次访问某个站点时服务器将要求浏览器查找并返回先前发送的Cookie信息。
  • HttpSession:Servlet提供了该接口,建立在URL重写和Cookie的基础上。Servlet可自动提供数据存储空间并关联session。

Cookie使用示例:

//index.jsp
<%
    String user = "";
    String pass = "";
    Cookie[] cookies = request.getCookies();
    for (int i = 0; cookies != null && i < cookies.length; i++) {
        if (cookies[i].getName().equals("testCookie")) {
            String[] strings = cookies[i].getValue().split("@");
            user = strings[0];
            pass = strings[1];
        }
    }
    if (user.isEmpty() || pass.isEmpty())
        out.print("Welcome guest");
    else out.print("Welcome " + user);
%>

//cookie.jsp
<%
    String user = request.getParameter("user");
    String pass = request.getParameter("pass");
    user = new String(user.getBytes("ISO-8859-1"), "UTF-8");
    pass = new String(pass.getBytes("ISO-8859-1"), "UTF-8");

    Cookie cookie = new Cookie("testCookie", String.format("%[email protected]%s", user, pass));
    response.addCookie(cookie);
%>

HttpSession使用示例:

//ServletSession
public class ServletSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();

        String message;
        int accessCount = 0;
        if (session.isNew()) {
            message = "Welcome here!";
        } else {
            message = "Welcome back!";
            Integer oldAccessCount = (Integer) session.getAttribute("accessCount");
            if (oldAccessCount != null)
                accessCount = oldAccessCount + 1;
        }
        session.setAttribute("accessCount", accessCount);

        String content = "<!DOCTYPE html>" +
                "<html>" +
                "<head>" + "<title>servlet session</title>" + "</head>" +
                "<body>" + message + "<br/>" +
                "会话编号:" + session.getId() + "<br/>" +
                "创建时间:" + session.getCreationTime() + "<br/>" +
                "最后访问:" + session.getLastAccessedTime() + "<br/>" +
                "</body>" +
                "</html>";
        out.println(content);
        out.flush();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <servlet>
        <servlet-name>ServletSession</servlet-name>
        <servlet-class>ServletSession</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletSession</servlet-name>
        <url-pattern>/ServletSession</url-pattern>
    </servlet-mapping>
</web-app>

原文地址:https://www.cnblogs.com/arseneyao/p/9319878.html

时间: 2024-10-13 11:24:40

[Java Web] JSP的相关文章

Java Web JSP概述

JSP: JSP是简化Servlet 编写的一种技术,它将Java代码和HTML 语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码来编写, 而对固定不变的静态内容采用普通静态HTML 页面的方式编写. 简单程序: 新建一个JSP页面,在body节点内<% %>中即可编写Java代码 <body> <% Date date = new Date(); System.out.println(date); %> </body> JSP可以放

java web JSP问题总结

问题01:Unknown tag (c:forEach). 导入jstl.jar包,再在jsp文件中加入:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>即可

9.Java web&mdash;JSP内置对象

容器内置了9大对象,这些对象在jsp页无需实例化,可以直接使用. 分别为request. response .session. application .out. pageContext .config .page. exception 1)request对象 request封装了由客户端请求的http所有细节,包括HTTP头信息,系统信息,请求方式,请求参数 request.getParameter("参数name");  //获取请求的url参数.不存在此参数返回null,存在参数

java web JSP语法详解

CSS 当要在站点上所有或部分网页上一致地应用相同样式时,可使用外部样式表.在一个或多个外部样式表中定义样式,并将它们链接到所有网页,便能确保所有网页外观的一致性.如果人们决定更改样式,只需在外部样式表中修改一次,而该更改会反映到所有与该样式表相链接的网页上.通常外部样式表以 .css 做为文件扩展名,例如 Mystyles.css.然后在需要此样式的页面中将其链接进来. 这是能够真正做到网页表现与内容分离的一种样式设计语言.相对于传统HTML的表现而言,CSS能够对网页中的对象的位置排版进行像

java web 开发实战经典(一)

一.jsp三种Scriptlet(脚本小程序) 1.<% %>  :定义局部变量.编写语句等. <% String str = "hello world!";//定义局部变量 out.println(str);//编写语句 %> 2.<%! %>  :定义全局变量.方法和类.(虽然此方可以编写类,但不建议使用.我们一般通过JavaBean的形式调用类) <%! public static final String INFO = "JA

java web学习笔记-jsp篇

转载自:http://www.cnblogs.com/happyfans/archive/2015/03/17/4343571.html 1.java web简介 1.1静态页面与动态页面   表现形式 所需技术 静态网页 网页内容固定,不会更新 html,css 动态网页 网页内容由程序动态显示,自动更新 html,css,DB,java/c#/php,javascript,xml,主流的动态网页脚本(jsp,asp.net,php) 1.2搭建java web开发环境 jdk1.7+tomc

Java Web(3):JSP基础

JSP:Java Server Pages JSP 源代码包含了 JSP 元素和 Template data(<% %>标签以外的部分) JSP 文件最终都会转换成 Servlet 去执行,执行过程: JSP 语法:1.编译器指令:2.脚本语法:3.动作语法 注释: <!-- HTML注释 --> <%-- JSP注释 --%> <!-- <%=new java.util.Date()%> --> 编译器指令:包含在<%@  %>中

Java Web基础 --- Jsp 综述(上)

摘要: J2EE是一套规范,而Servlet/Jsp是J2EE规范的一部分,是Tomcat的主要实现部分.在最初的应用实践中,当用户向指定Servlet发送请求时,Servlet利用输出流动态生成HTML页面,这导致Servlet开发效率极为低下.JSP技术通过实现普通静态HTML和动态部分混合编码,使得逻辑内容与外观相分离,大大简化了表示层的实现,提高了开发效率.本文以JSP的本质是Servlet为主线,结合JSP转译后所得的Servlet,详细探讨了JSP的原理.执行过程.脚本元素.编译指令

Java Web基础 --- Jsp 综述(下)

摘要: JSP脚本中包含九个内置对象,它们都是Servlet-API接口的实例,并且JSP规范对它们进行了默认初始化.本文首先通过一个JSP实例来认识JSP内置对象的实质,紧接着以基于请求/响应架构应用的运行机制为背景,引出JSP/Servlet的通信方式与内置对象的作用域,并对每个内置对象的常见用法进行深入介绍和总结. 一. JSP 九大内置对象概述及相关概念说明 JSP脚本中包含九个内置对象,这九个内置对象都是 Servlet API 接口的实例,并且JSP规范对它们进行了默认初始化(由 J