JSP核心概念以及应用
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 这些软件的提示跟跳转,维护上还稍微好一点,不然简直是灾难。