一文入门Java Web
前言
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.pngWebContent 为web应用程序的根目录
WEB-INF 存放java包和驱动
META-INF 用来配置应用程序、扩展程序等等
访问该页面
image.pngJSP语法
jsp声明
在jsp页面声明变量和方法
<%! java代码 %>
jsp表达式
在jsp页面执行的表达式
<%= 表达式 %>
注:表达式不以分号为结束
jsp注释
JSP是嵌入在HTML语言中,同样可以使用HTML注释
<!-- this is body-->
右击源代码可显示内容,完全暴露给用户。
<%--
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当前的全局属性,位于页面的最上方。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
常见属性有:
language 属性,指定jsp页面使用的脚本语言;
contentType 属性,指定jsp页面的编码格式,默认ISO8859编码格式,建议UTF-8编码;
import 属性,设置默认导入的java类;
pageEncoding 属性,jsp文件本身的编码;
include指令
将外部文件嵌入到当前jsp语句中,这个web文件可以是jsp文件、html文件。同时解析页面的jsp语句。
<%@ include file="header.html" %>
<%@ include file="footer.jsp" %>
JSP动作元素
动作元素在请求处理的时候起作用,用XML语法编写。
forward元素
把请求转发到一个新的页面。
<jsp:forward page="login.jsp"></jsp:forward>
等同于
request.getRequestDispatcher("login.jsp").forward(request,response);
注意forward指令下面的内容不会输出。
举例登录页面,访问index.jsp将调转到login.jsp页面。
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:forward page="login.jsp">
<jsp:param value="cseroad" name="username"/>
<jsp:param value="cserpad-password" name="password"/>
</jsp:forward>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<%
String userName = request.getParameter("username");
String passWord = request.getParameter("password");
out.println("用户名:"+userName);
out.println("<br/>");
out.println("密码:"+passWord);
%>
</body>
</html>
login.jsp接收到username、password参数
image.pnginclude元素
包含静态和动态文件。
语法格式
<jsp:include page="URL" flush="true|false"></jsp:include>
flush 表示是否从缓冲区读取。默认为false。
举例,传递bgcoloe颜色参数到body.jsp
<jsp:include page="body.jsp">
<jsp:param value="green" name="bgcolor"/>
</jsp:include>
body.jsp
<body bgcolor="<%= request.getParameter("bgcolor") %>">
hello
</body>
bgcolor参数通过指令传递了进来。
image.png附加
include 指令是包含页面的源代码,转化为一个servlet
include 动作是包含的页面的输出结果,主页面和被包含页面是两个独立的servelet。
useBean元素
用来在jsp页面中实例化或指定范围内使用javabean:
<jsp:useBean id="标示符" class="java类名" scope="作用范围" />
需要首先在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
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>useBean动作创建javaBean</title>
</head>
<body>
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"></jsp:useBean>
用户名:<%=myUsers.getUsername() %>
密码:<%=myUsers.getPassword() %>
</body>
</html>
因为用户名、密码没有进行初始化,所以为null。
image.pngsetProperty元素
给实例化的JavaBean对象的属性赋值。
可以通过表单赋值也可以通过手工设置。
这里以手工设置用户名、密码,还是上面的实例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>useBean动作创建javaBean</title>
</head>
<body>
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"></jsp:useBean>
<jsp:setProperty property="username" name="myUsers" value="cseroad"/>
<jsp:setProperty property="password" name="myUsers" value="123456"/>
用户名:<%=myUsers.getUsername() %>
密码:<%=myUsers.getPassword() %>
</body>
</html>
image.png
JSP九大隐式内置对象
Out对象
out对象是JspWriter类的实例,是向客户端打印字符串。
<%
out.println("hello");
out.print("world");
out.newLine();
%>
println和print都会输出一个换行符,但需要查看源代码才可以看得到。
也可以对输出缓冲区进行管理。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
out.println("获取当前缓冲区" + out.getBufferSize());
out.println("<br/>");
out.println("当前缓冲区剩余字节数目" + out.getRemaining());
%>
image.png
out.flush() 强制刷新缓冲区的数据
out.clearBuffer() 清空缓冲区数据
out.isAutoFlush() 是否自动清除缓冲区
request对象
request对象用来完成客户端的请求,是HttpServletRequest类的实例。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>request 对象实例</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="userName">
<input type="submit" name="提交">
</form>
请求方法名:<%= request.getMethod() %><br/>
请求的资源:<%= request.getRequestURI() %><br/>
请求使用的协议:<%= request.getProtocol() %><br/>
请求的服务器IP:<%= request.getServerName() %><br/>
请求的服务器端口:<%= request.getServerPort() %><br/>
客户端的IP地址:<%= request.getRemoteAddr() %><br/>
客户端的主机名:<%= request.getRemoteHost() %><br/>
请求的真实路径:<%= request.getRealPath("welcome.jsp") %><br/>
表单提交数据:<%= request.getParameter("userName") %>
</body>
</html>
image.png
以用户注册功能,访问注册页面,提交到do_register.jsp页面,并跳转到welcome.jsp欢迎页面。
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>录入表单信息</title>
</head>
<body>
<form action="do_register.jsp" method="post">
用户名:<input name="userName" type="text"><br/>
技能:
<input type="checkbox" name="skills" value="java">java
<input type="checkbox" name="skills" value="php">php
<input type="checkbox" name="skills" value="python">python
<input type="checkbox" name="skills" value="golang">golang
<br/>
<input type="submit" value="提交"/>
<input type="reset" value="重置">
</form>
</body>
</html>
do_register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
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<skillArr.length;i++){
out.println(skillArr[i]+"<br/>");
skills = skills + skillArr[i] + "";
}
}
request.setAttribute("userName",userName);
request.setAttribute("skills",skills);
%>
<jsp:forward page="welcome.jsp"></jsp:forward>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>welcome user </title>
</head>
<body>
信息展示页面<br/>
用户名:<%= request.getAttribute("userName") %><br/>
技能:<%= request.getAttribute("skills") %>
</body>
</html>
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()+"<br/>" );//每个两秒自动刷新一次
%>
设置Cookie相关属性
<%
Cookie myCookie = new Cookie("cseroad","cseroad-password");
myCookie.setMaxAge(3600);
response.addCookie(myCookie);
%>
访问
image.pngsession对象
session是一个时间概念,session对象在第一个jsp页面被装载时自动完成,完成会话管理。
只有当所有页面都关闭的时候,所有会话才都会被关闭。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>session实例</title>
</head>
<body>
session的唯一标识符:<%= session.getId() %><br/>
session创建时间:<%= new java.util.Date(session.getCreationTime()).toString()%><br/>
session最后的修改时间:<%= new java.util.Date(session.getLastAccessedTime()).toString() %><br/>
session的失效时间:<%= session.getMaxInactiveInterval() %><br/>
</body>
</html>
image.png
可以在WEB-INF的web.xml文件中修改session会话时间。
<session-config>
<session-timeout>10</session-timeout>
</session-config>
举个例子:
login.jsp登录页面,登录do_login.jsp在session中保存username,然后跳转到welcome.jsp欢迎用户页面。再超链接到注销logout.jsp页面。
代码如下:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登陆表单</title>
</head>
<body>
<form action="do_login.jsp" method="post">
userName:<input name="userName" type="text"><br/>
passWord:<input name="passWord" type="password"><br/>
<input type="submit" value="提交"/>
<input type="reset" value="重置">
</form>
</body>
</html>
do_login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
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
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>欢迎页面 </title>
</head>
<body>
<% if(session.getAttribute("userName") != null ){ %>
欢迎<%= session.getAttribute("userName")%>
<!-- //获取session的userName的value值 -->
<a href="logout.jsp">注销</a>
<br/>
<%} else{ %>
请先登录
<a href="login.jsp">登录</a>
<%} %>
<% if(session.isNew()){ %>
<br/>
欢迎新用户
<%}else{ %>
欢迎老用户
<%} %>
</body>
</html>
logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
session.invalidate();
response.setHeader("refresh", "2;URL=welcome.jsp");
%>
以上代码用到的主要方法有
getAttribute() 返回与会话中指定名称绑定在一起的对象
setAttribute() 使用指定名称将对象绑定到会话
getValueNames() 返回一个包含此SESSION种可用属性的数组,可以理解为表单提交的数组
application对象
application对象实现了用户间数据的共享,可存放全局变量。
开始于服务器启动,终止与服务器关闭。
服务器信息:<%= application.getServerInfo()%><br/>
应用名称:<%= application.getServletContextName()%><br/>
image.png
举个例子统计页面访问计数器:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Object obj = application.getAttribute("counter");
if(obj == null){
application.setAttribute("counter", new Integer(1));
out.println("该页面被访问1次<br/>");
}else{
int counterValue = Integer.parseInt(obj.toString());
counterValue++;
out.println("该页面被访问了"+counterValue+"次<br/>");
application.setAttribute("counter", counterValue);
}
%>
</body>
</html>
config对象
config 对象是在一个Servlet初始化时,JSP引擎向他传递信息用的。
在web.xml中添加内容
<servlet>
<servlet-name>config</servlet-name>
<jsp-file>/01/config.jsp</jsp-file>
<init-param>
<param-name>username</param-name>
<param-value>cseroad</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>config</servlet-name>
<url-pattern>/01/*</url-pattern>
</servlet-mapping>
config.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>config对象实例</title>
</head>
<body>
用户名:<%= config.getInitParameter("username") %><br/>
密码:<%= config.getInitParameter("password") %><br/>
</body>
</html>
访问config.jsp,可以获取到用户名、密码。
image.pngexception对象
当页面产生异常,就会有exception对象。如果jsp页面要使用该对象,必须设置 isErrorPage为true,否则无法编译。
设置除数为零的异常。访问index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page errorPage="throw_error.jsp" %>
<%
int a = 1/0;
%>
跳转到throw_error.jsp捕捉异常文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>异常处理</title>
</head>
<body>
异常描述信息
<%
out.println(exception.getMessage());
%>
<br/>
exception对象的字符串描述
<%
out.println(exception.toString());
%>
</body>
</html>
image.png
page对象
page对象指当前jsp页面本身,像类的this指针,是java.lang.Object类的实例。
和Object类的方法相同。
当前page页面对象的字符串描述:<%=page.toString()%>
访问:
image.png查看Catalina文件可获取到该文件编译后的class类。
image.pngpageContent对象
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
四个域对象
pageContext
仅作用于当前jsp页面
request
仅作用于同一个请求,主要用于请求转发
session
仅作用于一次会话,在servlet中可以通过request对象获取
application
作用于整个web应用
参考资料
https://ke.jikexueyuan.com/zhiye/javaweb/
https://www.imooc.com/video/3955