七的博客

JSP核心概念以及应用

Java

JSP核心概念以及应用

总结下最近学习的 JSP 相关知识点。

JSP 的全程是 Java Server Pages ,可以用来创建动态的网页技术。 所谓的动态就是,HTML 里面通常是静态页面,除非是通过 AJAX 跟服务端进行通信交互。

而 JSP 则可以将 HTML 代码跟 Java 代码结合起来,制作出可以响应用户请求的页面。也就是说,JSP 页面中是同时包含 Java 代码跟 HTML 代码的。

跟 Servlet 的区别就在于,JSP 在 HTML 里面写 JAVA 代码,Servlet 就是在 Java 里面拼接 HTML 代码。

但是实际用下来,感觉比 PHP 还是麻烦很多。 因为 PHP 是脚本语言,所以开发动态网页真的很简洁很快速。而 JSP 是需要跟 Java 语言结合使用的,所以编写起来要费劲不少。

先看下一个登录的 JSP 页面长什么样:

<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
    <title>用户登录页面</title>
</head>
<body>
    <h2>登录信息填写</h2>
    <% 
        String userId = request.getParameter("user");
        String password = request.getParameter("password");
        String errorMsg = null;
        if (userId != null && password != null) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_demo", "root", "password");
                PreparedStatement pst = conn.prepareStatement("SELECT * from users where username=? and password=?");
                pst.setString(1, userId);
                pst.setString(2, password);
                ResultSet rs = pst.executeQuery();
                
                if (rs.next()) {
                    session.setAttribute("user", userId);
                    response.sendRedirect("index.jsp");
                } else {
                    errorMsg = "无效的用户名或者密码.";
                }
                rs.close();
                pst.close();
                conn.close();
            } catch (Exception e) {
                errorMsg = "连接数据库错误! 请稍后重试";
            }
        }
    %>
    <form action="login.jsp" method="post">
        Username: <input type="text" name="user" required><br>
        Password: <input type="password" name="password" required><br>
        <input type="submit" value="Login">
        <% if (errorMsg != null) { %>
            <p><%= errorMsg %></p>
        <% } %>
    </form>
</body>
</html>

从代码中可以看出,既有 HTML 的标签,又有 Java 代码。在 JSP 页面中写 Java 代码有下面几种方式:

  • 包含任意行数的 Java 代码片段:

比如你要写多行代码,那么你就要在 <% %> 里面去写,比如:

  <% 
  out.println("Hello, World"); 
  out.println("Hello, World,JSP"); 
  %>
  • 输出一个表达式:

比如要输出一个人的名字,那么可以这么写,使用 <%= %> 的形式。

  <%= "Hello, " + your_name %>

这里的 your_name 就是一个变量,相当于是拼接字符串一样的。最后页面上就会显示 Hello, 后跟用户名。

  • 声明一个表达式:

使用的语法是 <%! %> 包裹起来。

  <%! int i = 0; %>

JSP 指令

指令就是来配置 JSP 页面的行为,这些指令对整个页面都会有效果。

指令包括下面几种:

  • page

page 指令是用来定义页面的依赖属性,比如内容类型 contentType 、错误页面 errorPage 等。

  <%@ page contentType="text/html;charset=UTF-8" %>   // 设置页面的编码为 utf8
  • include

include 指令就是用来引入其他页面的,比如我们写 HTML 页面的时候,会将页面分为 Header.html 、Left.html、Foot.html 等等。 JSP 页面也可以这样将页面拆开来,比如:

  <%@ include file="header.jsp" %>
  • taglib

taglib 就是可以引入自定义的一些标签库,通过这些标签库可以扩展页面的标签语法。比如我们引入 JSTL。

  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

JSP 隐式对象

JSP 到目前为止一共有 9 个内置对象,这些对象由 JSP 自动创建。可以直接在 JSP 页面中直接用,不需要任何显式的定义或初始化。

  • request

request 就是可以在JSP页面中获取客户端发送的参数。

  <%
      String username = request.getParameter("username");
  %>
  <p>欢迎你, <%= username %></p>

上面的例子就是获取名为 【username】 的请求参数。通常用于获取通过表单提交的数据。

  • response

response 就是可以在 JSP 页面设置响应的内容类型。

  <%
      response.setContentType("text/html");
  %>

上面的例子是设置响应的 MIME 类型,告诉浏览器返回的内容是HTML 格式的。

  • session

session 可以用来存储和查询用户的会话信息,比如登录状态等等。

  <%
      session.setAttribute("isLogin", true);
  %>
  <%
      if (Boolean.TRUE.equals(session.getAttribute("isLogin"))) {
          out.println("用户已经登录了.");
      } else {
          out.println("用户还没有登录.");
      }
  %>
  • application

application 可以在全局范围内保存以及访问一些属性。

  <%
      Integer count = (Integer) application.getAttribute("count");
      if (count == null) {
          count = 0;
      }
      count++;
      application.setAttribute("count", count);
  %>
  <p>P我的网站被访问了多少次: <%= count %></p>

上面的例子就是用 application 来保存页面的总访问次数。

  • out

out 对象可以向浏览器输出文本。

  <%
      out.println("Hello, world!");
  %>

上面的例子就是向浏览器输出 HelloWorld。

  • config

config 用于读取一些初始化的参数。

  <%
      String supportQq = config.getInitParameter("supportQQ");
  %>
  <p>网站支不支持 QQ 注册: <%= supportQq %></p>

上面的例子就是读取在 web.xml 文件中配置参数 supportQQ ,然后做不同的业务逻辑处理。

  • pageContext

pageContext 可以保存和读取 在当前页面请求范围内的属性

  <%
      pageContext.setAttribute("validMessage", "当前页面保存的验证错误消息");
  %>
  <p><%= pageContext.getAttribute("validMessage") %></p>
  • page

page 可以引用当前页面的实例。

  <%
      pageContext.setAttribute("self", this);
  %>

page 就是当前的 JSP 页面本身,通常用于内部处理。page 对象相当于 this 对象,在 JSP 页面中是一致的。

  • exception

在错误页面显示错误信息。

  <%@ page isErrorPage="true" %>
  <p>错误消息: <%= exception.getMessage() %></p>

JSP 简单的工作流程总结

JSP 的流程就是转换为 Servlet 代码,执行业务逻辑,然后再返回 HTML 内容给页面。

  • 客户端发送请求给服务端,这个请求将被发送到 JSP 页面上去。
  • 第一次请求的话,没有缓存,所以 JSP 页面会先被编译成 Servlet 代码。 后续请求的话,会直接使用已经编译好的代码。
  • 服务端执行 Servlet 的代码。 Servlet 代码就是普通的 Java 代码,可以进行数据库操作,读取文件等等。
  • Servlet 的代码执行完后,通常会生成 HTML 页面返回给浏览器,浏览器负责渲染。

JSP 的缺点

通过最近写的 JSP 程序来看,如果大量的 Java 代码混合在 JSP 中,后面维护是 不太好维护的。

除非是借助于 Eclipse 或者 IDEA 这些软件的提示跟跳转,维护上还稍微好一点,不然简直是灾难。