前言
Java Web属于JAVAEE 方向,一般为服务器端的程序应用。指使用java语言对web进行开发,而jsp服务于Java Web开发。
简介
JSP全称Java Server Pages,是一种动态网页开发的标准。当浏览器访问一个jsp页面时,jsp引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,再由Servlet引擎加载编译后的代码并执行,把执行结果返回给客户端。
第一个Java Web 应用程序
使用eclipse创建项目,编写第一个java web应用程序。
image.png
WebContent 为web应用程序的根目录
WEB-INF 存放java包和驱动
META-INF 用来配置应用程序、扩展程序等等
访问该页面
image.png
JSP语法
jsp声明
在jsp页面声明变量和方法
jsp表达式
在jsp页面执行的表达式
注:表达式不以分号为结束
jsp注释
JSP是嵌入在HTML语言中,同样可以使用HTML注释
右击源代码可显示内容,完全暴露给用户。
this is jsp comments
--%>
查看源代码并不会显示。
JSP程序段中的注释
//this is comments
/*this is comments*/
%>
查看源代码也不会显示,同样适用。
jsp生命周期
jsp生命周期大概需要以下阶段
编译阶段
当浏览器请求jsp页面时,jsp引擎首先会编译这个文件。而编译这个文件需要解析jsp文件、将jsp转化为servlet、编译servlet。
初始化阶段
载入jsp文件后,在请求之前调用jspInit()方法进行初始化。
执行阶段
当jsp页面完成初始化后,jsp引擎会调用_jspService()方法。然后和请求行为进行交互。
销毁阶段
当jsp页面从容器移除,调用jspDestroy()方法进行销毁。
JSP指令
jsp指令用来设置jsp页面相关的属性。
常用的是page指令、include指令、taglib指令。
page指令
主要用来定义JSP当前的全局属性,位于页面的最上方。
常见属性有:
language 属性,指定jsp页面使用的脚本语言;
contentType 属性,指定jsp页面的编码格式,默认ISO8859编码格式,建议UTF-8编码;
import 属性,设置默认导入的java类;
pageEncoding 属性,jsp文件本身的编码;
include指令
将外部文件嵌入到当前jsp语句中,这个web文件可以是jsp文件、html文件。同时解析页面的jsp语句。
JSP动作元素
动作元素在请求处理的时候起作用,用XML语法编写。
forward元素
把请求转发到一个新的页面。
等同于
request.getRequestDispatcher("login.jsp").forward(request,response);
注意forward指令下面的内容不会输出。
举例登录页面,访问index.jsp将调转到login.jsp页面。
index.jsp
pageEncoding="UTF-8"%>
login.jsp
pageEncoding="UTF-8"%>
loginString userName = request.getParameter("username");
String passWord = request.getParameter("password");
out.println("用户名:"+userName);
out.println("
");
out.println("密码:"+passWord);
%>
login.jsp接收到username、password参数
image.png
include元素
包含静态和动态文件。
语法格式
flush 表示是否从缓冲区读取。默认为false。
举例,传递bgcoloe颜色参数到body.jsp
body.jsp
hello
bgcolor参数通过指令传递了进来。
image.png
附加
include 指令是包含页面的源代码,转化为一个servlet
include 动作是包含的页面的输出结果,主页面和被包含页面是两个独立的servelet。
useBean元素
用来在jsp页面中实例化或指定范围内使用javabean:
需要首先在src目录创建包名。
image.png
这里创建com.po包,Users类
Users.java
package com.po;
public class Users {
private String username;
private String password;
//保留默认的构造方法
public Users() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
再在useBean元素的class属性指定包名。
bean.jsp
pageEncoding="UTF-8"%>
useBean动作创建javaBean用户名:
密码:
因为用户名、密码没有进行初始化,所以为null。
image.png
setProperty元素
给实例化的JavaBean对象的属性赋值。
可以通过表单赋值也可以通过手工设置。
这里以手工设置用户名、密码,还是上面的实例:
pageEncoding="UTF-8"%>
useBean动作创建javaBean用户名:
密码:
image.png
JSP九大隐式内置对象
Out对象
out对象是JspWriter类的实例,是向客户端打印字符串。
out.println("hello");
out.print("world");
out.newLine();
%>
println和print都会输出一个换行符,但需要查看源代码才可以看得到。
也可以对输出缓冲区进行管理。
pageEncoding="UTF-8"%>
out.println("获取当前缓冲区" + out.getBufferSize());
out.println("
");
out.println("当前缓冲区剩余字节数目" + out.getRemaining());
%>
image.png
out.flush() 强制刷新缓冲区的数据
out.clearBuffer() 清空缓冲区数据
out.isAutoFlush() 是否自动清除缓冲区
request对象
request对象用来完成客户端的请求,是HttpServletRequest类的实例。
pageEncoding="UTF-8"%>
request 对象实例请求方法名:
请求的资源:
请求使用的协议:
请求的服务器IP:
请求的服务器端口:
客户端的IP地址:
客户端的主机名:
请求的真实路径:
表单提交数据:
image.png
以用户注册功能,访问注册页面,提交到do_register.jsp页面,并跳转到welcome.jsp欢迎页面。
register.jsp
pageEncoding="UTF-8"%>
录入表单信息用户名:
技能:
java
php
python
golang
do_register.jsp
pageEncoding="UTF-8"%>
String userName = request.getParameter("userName");
String skills = "";
String[] skillArr = request.getParameterValues("skills");
if(skillArr != null && skillArr.length > 0){
for(int i=0;i
out.println(skillArr[i]+"
");
skills = skills + skillArr[i] + "";
}
}
request.setAttribute("userName",userName);
request.setAttribute("skills",skills);
%>
welcome.jsp
pageEncoding="UTF-8"%>
welcome user信息展示页面
用户名:
技能:
image.png
image.png
重点关注
getParameter() 返回指定的参数值
getParameterValues() 返回指定参数值的数组
setAttribute() 存储请求中的属性
getAttribute() 返回指定属性的属性值
response对象
response对象是javax.servlet.http.HttpServletResponse类的实例。
response.setHeader("Cache-Control","no-cache");//不缓存
response.sendRedirect("http://www.baidu.com"); //请求重定向,跳转至百度
response.setIntHeader("Refresh",2);
out.println("data is "+ new java.util.Date().toString()+"
" );//每个两秒自动刷新一次
%>
设置Cookie相关属性
Cookie myCookie = new Cookie("cseroad","cseroad-password");
myCookie.setMaxAge(3600);
response.addCookie(myCookie);
%>
访问
image.png
session对象
session是一个时间概念,session对象在第一个jsp页面被装载时自动完成,完成会话管理。
只有当所有页面都关闭的时候,所有会话才都会被关闭。
pageEncoding="UTF-8"%>
session实例session的唯一标识符:
session创建时间:
session最后的修改时间:
session的失效时间:
image.png
可以在WEB-INF的web.xml文件中修改session会话时间。
10
举个例子:
login.jsp登录页面,登录do_login.jsp在session中保存username,然后跳转到welcome.jsp欢迎用户页面。再超链接到注销logout.jsp页面。
代码如下:
login.jsp
pageEncoding="UTF-8"%>
登陆表单userName:
passWord:
do_login.jsp
pageEncoding="UTF-8"%>
String userName = request.getParameter("userName");
String passWord = request.getParameter("passWord");
if(userName != null && passWord != null){
session.setAttribute("userName",userName);//在session中保存userName
response.setHeader("refresh","2;URL=welcome.jsp");
}
%>
welcome.jsp
pageEncoding="UTF-8"%>
欢迎页面欢迎
注销
请先登录
登录
欢迎新用户
欢迎老用户
logout.jsp
pageEncoding="UTF-8"%>
session.invalidate();
response.setHeader("refresh", "2;URL=welcome.jsp");
%>
以上代码用到的主要方法有
getAttribute() 返回与会话中指定名称绑定在一起的对象
setAttribute() 使用指定名称将对象绑定到会话
getValueNames() 返回一个包含此SESSION种可用属性的数组,可以理解为表单提交的数组
application对象
application对象实现了用户间数据的共享,可存放全局变量。
开始于服务器启动,终止与服务器关闭。
服务器信息:
应用名称:
image.png
举个例子统计页面访问计数器:
pageEncoding="UTF-8"%>
Insert title hereObject obj = application.getAttribute("counter");
if(obj == null){
application.setAttribute("counter", new Integer(1));
out.println("该页面被访问1次
");
}else{
int counterValue = Integer.parseInt(obj.toString());
counterValue++;
out.println("该页面被访问了"+counterValue+"次
");
application.setAttribute("counter", counterValue);
}
%>
config对象
config 对象是在一个Servlet初始化时,JSP引擎向他传递信息用的。
在web.xml中添加内容
config
/01/config.jsp
username
cseroad
password
123456
config
/01/*
config.jsp
pageEncoding="UTF-8"%>
config对象实例用户名:
密码:
访问config.jsp,可以获取到用户名、密码。
image.png
exception对象
当页面产生异常,就会有exception对象。如果jsp页面要使用该对象,必须设置 isErrorPage为true,否则无法编译。
设置除数为零的异常。访问index.jsp
pageEncoding="UTF-8"%>
int a = 1/0;
%>
跳转到throw_error.jsp捕捉异常文件
pageEncoding="UTF-8"%>
异常处理异常描述信息
out.println(exception.getMessage());
%>
exception对象的字符串描述
out.println(exception.toString());
%>
image.png
page对象
page对象指当前jsp页面本身,像类的this指针,是java.lang.Object类的实例。
和Object类的方法相同。
当前page页面对象的字符串描述:
访问:
image.png
查看Catalina文件可获取到该文件编译后的class类。
image.png
pageContent对象
pageContent 对象提供了对jsp页面所有对象和空间的访问。也可以访问本页面的session。
通过pageContent对象输出hello world。
JspWriter myOut = pageContext.getOut();
myOut.println("hello world");
%>
通过pageContent对象设置username属性保存到session,并输出。
pageContext.setAttribute("username", "cseroad",pageContext.SESSION_SCOPE);
String value = session.getAttribute("username").toString();
out.println(value);
%>
image.png
参考资料