【基础知识】_JSP

JSP

JSP

JSP概念

jsp是一个特殊的页面,其中既可以指定定义html标签,编写无逻辑的html代码,也可以通过特殊符号<%java代码%>编写有逻辑的java代码。实际上,如果只是html静态资源+Servlet动态资源的项目,当我们请求动态资源之后,页面跳转到动态资源对应页面,这时候如果想让动态资源对应页面美观,就还要通过response.getWrite().write(String str)方法来进行很多html格式的页面设置,编写复杂也不便于阅读和修改,所以jsp作为一种动态资源格式很好的解决了这个问题。

JSP在本质上就是一个Servlet,jsp文件编译后的字节码文件内部结构其实就是一个Servlet类。

JSP使用方法

  • <% 代码 %>:该符号中编写的java代码,相当于在Servlet类中service方法的方法体。同一个jsp文件中的<% 代码 %>可以被截断,分别放在几个不同的位置,最后编译器会把所有代码先放在一起再编译。
  • <%! 代码 %>:该符号中编写的java代码,在jsp转换后的java类的成员位置。
  • <%= 代码 %>:该符号中编写的java代码,会输出到页面上。java中sout输出语句的参数可以是什么,该符号中编写的java代码就可以是什么。
  • <%–注释内容–%>:注释。

JSP内置对象

在jsp动态资源中有一些java对象不需要获取和创建,可以直接使用:

  • request

  • response

  • out:字符输出流对象,out.write()方法与response.getWriter()的作用相似,都是将字符串参数直接输出到浏览器页面上。

  • pageContext:pageContext主要用于设定一个当前页面的共享数据,是范围最小的数据共享域

    e.g.

    1
    2
    3
    4
    5
    6
    <%--设置当前页面的共享数据(范围最小的共享域)--%>
    <% pageContext.setAttribute("msg","健身 让生活的意义变多!"); %>

    <%--JSP中的输出到页面脚本<%= %>可以直接输出中文字符和空格等特殊字符到页面上,
    JSP已经帮我们设置好了响应文本到页面上所采用的字符集"text/html;charset=UTF-8"--%>
    <%= pageContext.getAttribute("msg") %>
  • session

  • application:其实就是ServletContext对象,主要用于操作所有用户间共享的数据。

  • page

  • config

  • exception

使用案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.net.URLDecoder" %>
<%@ page import="java.io.PrintWriter" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>lasttime</title>
</head>
<body>

<%
response.setContentType("text/html;charset=utf-8");
//设置响应的消息体的数据格式和编码一般放在第一行。

Cookie[] cs = request.getCookies();
String login = null;

Boolean hascookie = false;

if(cs != null && cs.length > 0) {
for(Cookie c : cs) {
if(c.getName().equals("lastTime")) {
hascookie = true;

Date date = new Date();
//获取当前时间。
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//设置一个时间格式对象。
String time = df.format(date);
//将固定格式时间对象类型转化为字符串类型。
String urltime = URLEncoder.encode(time, "utf-8");
//将时间字符串进行URL编码。

String reurltime = c.getValue();
String retime = URLDecoder.decode(reurltime, "utf-8");
//取出上一次登录的时间字符串并进行URL解码。

login = "欢迎回来,您上次访问时间为:" + retime;

c.setValue(urltime);
//重设登录时间。
c.setMaxAge(60);
//这个cookie可以存活一分钟。

response.addCookie(c);
//cookie跟新之后要发送这个新的cookie给浏览器,那么原来那个键为lastTime的cookie就会被覆盖。
//(重要:一个浏览器页面中可以有多个cookie,但是这些cookie的键不能相同,
// 一旦添加一个已有键名的cookie,原来那个同键名cookie会被新的替代。)
break;
}
}
}

if(cs == null || cs.length == 0 || hascookie == false){
Date date = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = df.format(date);
String urltime = URLEncoder.encode(time, "utf-8");

Cookie cookie = new Cookie("lastTime",urltime);
cookie.setMaxAge(60);
response.addCookie(cookie);

login = "您好,欢迎您首次访问";
}

out.write("<h1>"+login+"</h1>");
%>

</body>
</html>

JSP指令

主要通过<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>的格式导入一些资源文件,用来配置JSP页面。常用指令名称有:

  • page:用于配置JSP页面

    • contentType:设置响应体的MIME类型和字符集
    • import:用于导入jar包

    e.g.

    1
    2
    <%@ page import="java.io.PrintWriter" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  • include:导入页面的资源文件

    e.g. <%@ include file="top.jsp"%>

  • taglib: 导入资源文件,主要用于导入标签库jar包

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


MVC开发模式

虽然jsp格式文档简化了Servlet的开发,但是真正把大量java代码和html代码放在同一个jsp文档中,维护较为困难,难以分工协作,所以后来java的web开发,借鉴了mvc开发模式,使得程序的设计更加合理。

  • M:Model,主要通过javabean类型的Java类来实现,定义一些具体的业务操作,比如查询数据库、封装对象。
  • V:View,主要通过JSP文档来实现,主要用于展示动态资源中需要在浏览器页面中展示的数据,并通过html代码进行页面的美化。在mvc模式中,jsp文档主要设置展示数据时的页面,所以尽量不要写具有逻辑性的java代码。
  • C:Controller,主要通过Servlet类来实现,定义一些逻辑性的操作,在模型和视图之间起到过度作用。

EL表达式

概念语法

EL表达式的作用主要是用于jsp页面中,用来替换jsp中的<%= java代码 %>符号,替换成&{EL表达式},也就是说java中sout语句的参数可以是什么类型的数据,EL表达式就可以是什么类型的数据,只不过一些对象的写法可能会有不同。jsp默认支持el表达式,不需要额外引入jar包。

主要作用

el表达式主要用于通过web项目的一些域对象来获取这些域中的共享数据,并将这些数据在页面上展示出来,写法有:

  • ${域对象名称.键名}:获取键名对应的值。比如${request.name}就相当于<%= request.getAttribute(“name”) %>
  • ${域名称.键名.属性名}:获取键名对应的封装类实例对象的一个属性的值。
  • ${域名称.键名[索引]}:获取键名对应的List集合中索引对应的元素。
  • ${域名称.键名.key名称}/${域名称.键名["key名称"]}:获取键名对应的Map集合中key名对应的值。

常用的域对象名称有:

  • pageScope:表示Servlet中的pageContext对象
  • requestScope:表示Servlet中的request对象
  • sessionScope:表示Servlet中的session对象
  • applicationScope:表示Servlet中的ServletContext对象

e.g. ${pageContext.request.contextPath}可以动态获取当前动态资源的虚拟目录。

使用案例

javabean类案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* User的封装类,也就是JavaBean。
* 注意很重要的一点,我们所说的对象的属性并不是指它的成员变量,而是指getter方法名去掉get,
* 剩余部分变成小写的这个词,具体的属性值就是调用该getter方法所返回的值。
*/
public class User {
private Date birthday;

public void setBirthday(Date birthday) {
this.birthday = birthday;
}

public Date getDate() {
return birthday;
}

/**
* 定义获取生日字符串方法getStrdate(),那么strdate就是User对象的一个属性,属性值类型为String类型。
* (这也叫逻辑视图:没有与属性名相同的成员变量,该属性是为了更多样化地展现成员变量)
* @return
*/
public String getStrdate() {
SimpleDateFormat adf = new SimpleDateFormat("yyyy年MM月dd日:HH:mm:ss");
String strdate = adf.format(birthday);
return strdate;
}
}

EL表达式使用案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<html>
<head>
<title>Title</title>
</head>
<body>

<%
User user = new User();
user.setBirthday(new Date());

request.setAttribute("员工",user);
%>

${requestScope.员工.strdate}
<%--获取对象的属性值:${域名称.键名.属性名}--%>
<%--JSP真厉害,编码字符集都设置好了,就连中文属性都没问题。}--%>
<%--非常重要:一个对象的属性并不是指它的成员变量,而是指getter方法名去掉get,
剩余部分变成小写的这个词,具体属性值就是调用该getter方法所返回的值。--%>

</body>
</html>

JSTL

概念用法

  • JSTL是指JSP标准标签库,是一些额外的jsp标签。
  • 先导入jstl相关jar包,然后再jsp文档中引入该标签库<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>即可使用。
  • jstl标签的主要作用就是直接通过标签实现一些逻辑操作。虽然直接再jsp文档中通过<% %>脚本也可以编写带有逻辑操作的java代码,但是el表达式并不能写入java代码中。但是el表达式是可以直接写入jstl标签内的,所以jstl标签常用于与el表达式搭配,达到逻辑性显示共享域中数据的效果。

常用JSTL标签

  • if:相当于java代码中的if语句

    test为该标签的必须属性,该属性的属性值为boolean表达式,如果该表达式为true,则jsp页面上会显示if标签体内容,如果为false,则不显示标签体内容。

  • choose:相当于java代码中的switch语句

    • choose标签相当于java中的switch声明
    • when标签相当于java中的case语句
    • otherwise标签相当于java中的default语句
  • foreach:详单与java代码中的for语句,也是最常用的jstl标签

    e.g.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <%--jstl最大的作用就是可以和html语句、el表达式配合嵌套使用--%>
    <%--foreach的属性属性:items(容器对象),var(容器中元素的临时变量),varStatus(循环状态元素)--%>
    <c:forEach items="${list}" var="user" varStatus="s">

    <tr bgcolor="red">
    <%--varStatus的属性:index(容器中元素的索引,从0开始),count(循环次数,从1开始)--%>
    <td>${s.count}</td>

    <%--var的属性即为list中的javabean对象中的getter方法所返回的值--%>
    <td>${user.strdate}</td>
    </tr>

    </c:forEach>

软件设计三层架构

  • 界面层:用户在浏览器上看见的界面,用户可以通过界面上的组件和服务器进行交互
  • 业务逻辑层:处理业务逻辑
  • 数据访问层:操作数据存储文件