JSP

Java Web入门——JSP

jsp本质就是servlet,运行在服务器端,处理请求并生成动态内容。对应的java和class文件在tomcat目录下的work目录。

常用语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<!-- 客户端可见,html注释-->
<%--jsp注释,客户端不可见 --%>
<% // jsp脚本,注释在客户端不可见。
out.println("hehehhehe");
%>
<%-- Java代码:声明 --%>
<%!
String s = "张三";
int add(int x, int y) {
return x+y;
}
%>

<%-- Java代码:表达式,不以;结束 --%>
s= <%=s %><br>
x+y= <%=add(1, 2) %><br>
  1. <% %>叫做脚本片段,其中写的内容会翻译在Servlet的Service方法中,显然我们可以在Service方法中定义局部变量或者调用其他方法,但是不能在Service中再定义其他的方法,也就是我们可以在<%%>中定义局部变量或者调用方法,但不能定义方法。在jsp页面可以有多个脚本片段,但是多个脚本片段之间要保证结构完整。

  2. <%!%>称作声明,其中写的内容将来会直接翻译在Servlet类中,因为我们可以在类中定义方法和属性以及全局变量,所以我们可以在<%!%>中声明方法、属性、全局变量。

  3. <%=%>称作jsp表达式,用于将已经声明的变量或者表达式输出到网页上面。

  4. 直接写在jsp页面”\\“中的代码称作模板元素,将来会Servlet的Service方法中的out.write(“___”)中,作为输出内容。

JSP页面生命周期

1
2
3
4
5
6
7
8
9
10
11
st=>start: Start
request=>operation: 用户发出请求index.jsp
cond=>condition: 是否是第一次请求?
compile=>operation: JSP引擎把该JSP文件转换成为一个Servlet,生成字节码文件,并执行jspInit()
binary=>operation: 生成的字节码文件
jspService=>operation: 解析执行,jspService()
e=>end

st->request->cond
cond(yes)->compile->binary
cond(no)->binary->jspService->e

jspService()方法被调用来处理客户端的请求。对于每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程的方式执行可以大大降低对系统的资源需求,提高系统的并发量及响应时间。但也会带来多线程同步问题。由于该Servlet始终驻于内存,所以响应非常快。

JSP内置对象

JSP内置对象是web容器创建的一组对象,不适用new关键字就可以使用的内置对象(例如out)。

常用内置对象:

  • out:
    • JspWriter类的实例,是向客户端输出内容常用的对象。
    • void println() 向客户端打印字符串
    • void clear() 清除缓冲区的内容,如果在flush之后调用会抛出异常
    • void clearBuffer() 清除缓冲区内容,如果在flush之后调用不会抛出异常
    • void flush() 将缓冲区内容输出到客户端
    • int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
    • int getRemaining() 返回缓冲区还剩余多少可用
    • boolean isAutoFlush() 返回缓冲区满时,自动清空/抛出异常
    • void close() 关闭输出流
  • request
    • 客户端的请求信息,他是HttpServletRequest类的实例。
    • String getParameter(String name) 返回name指定参数的参数值
    • String[] getParameterValues(String name) 返回包含参数name的所有值的数组(checkbox多选)
    • void setAttribute(String, Object) 储存此请求中的属性
    • object getAttribute(String name) 返回指定属性的属性值
    • String getContentType() 得到请求体的MIME类型
    • String getProtocol() 返回请求用的协议类型及版本号
    • String getServerName() 返回接受请求的服务器主机名
    • request.setCharacterEncoding(“utf-8”) 解决中文乱码问题
  • response
  • session
  • application
  • 不常用的:
    • Page
    • pageContext
    • exception
    • config

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
28
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>
<h1>setProperty动作元素</h1>
<hr>
<!--根据表单自动匹配所有的属性 -->
<%--
<jsp:setProperty name="myUsers" property="*"/>
--%>
<!--根据表单匹配所有部分的属性 -->
<%--
<jsp:setProperty name="myUsers" property="username"/>
--%>
<!--根表单无关,通过手工赋值给属性 -->
<%--
<jsp:setProperty name="myUsers" property="username" value="lisi"/>
<jsp:setProperty name="myUsers" property="password" value="888888"/>
--%>
<!--通过URL传参数给属性赋值 -->
<jsp:setProperty name="myUsers" property="username"/>
<jsp:setProperty name="myUsers" property="password" param="mypass"/>
<!-- 使用传统的表达式方式来获取用户名和密码 -->
<%--
用户名:<%=myUsers.getUsername() %><br>
密码:<%=myUsers.getPassword() %><br>
--%>
<!-- 使用getProperty方式来获取用户名和密码 -->
用户名:<jsp:getProperty name="myUsers" property="username"/> <br>
密码:<jsp:getProperty name="myUsers" property="password"/><br>
<br>

request.getAttribute(s); & request.getParameter(s);区别

getAttribute(s)是request域的一个属性,只能由request.setAttribute(k, v);放入

getParameters(s)获取的值是URL传递过来的值

JSP中四种会话跟踪技术(四大作用域)

  • application域 数据在一个应用服务器范围内有效,通过application对象访问
  • session域 数据在一次会话范围内容有效,通过session对象访问
  • request域 数据在一个服务器请求范围内有效,通过request对象访问
  • page域(pageContext) 数据在一个页面范围内有效,通过pageContext对象访问

JSP一共有以下6中基本动作

JSP:include (当页面被请求的时候引入一个文件)

JSP:forward (将请求转到另一个页面)

JSP:useBean (获得JavaBean的一个实例)

JSP:setProperty (设置JavaBean的属性)

JSP:getProperty (获得JavaBean的属性)

JSP:plugin (根据浏览器类型为Java插件生成object或者embed两种标记)

<%!%> 表示声明一个变量
<%%>表示所执行的jsp语句块,也就是相应的java代码
<%=%>相当于<%out.println(“字符串”);%>,在网页中显示某一个变量或某一个表达式的值

声明: 将声明的变量和方法,作为Servlet类的变量和方法。

脚本: 将代码插入到Servlet的service方法中。

Ty.Wings wechat
欢迎您订阅我的公众号,并在GitHub上为我Star!