JavaWeb
使用Java开发Web服务的技术,统称为JavaWeb。
B/S与C/S模式
- B/S:Browser/Server 浏览器/服务器模式
- 用户只需要一个浏览器即可访问服务器
- C/S:Clint/Server 客户端/服务器模式
- 用户需要下载客户端才能访问服务器
网站
用户通过浏览器访问某个域名或IP地址时,浏览到的综合性页面
实际就是发布在服务器上的一个应用程序,用户通过浏览器访问该程序。
网页
网站中的一个页面
- 静态页面:所有人看到的数据都一致
- 动态页面:不同的人看到的页面中的数据不一致
JavaWeb就是B/S模式下的软件开发,开发综合性的服务网站。
网络服务器
部署Web项目的平台。
Tomcat
由Apache、Sun和其他公司及个人共同开发的web服务器。
免费、开源、轻量级,在中小型系统中普遍被使用。
是开发和调试Web项目的首选。
Maven
用于结构化管理jar文件的工具。
通过在Maven项目中加入某个jar文件的依赖,让其自动从Maven云仓库中下载对应的jar文件。
访问服务器的某个URL
- 在浏览器的地址栏中输入对应的URL,属于GET提交
- 使用a标签,在href中输入对应的URL,属于GET提交
- 使用form表单,在action中输入对应的URL,通过method修改提交方式为GET或POST
Servlet的生命周期
构造方法**-->init()-->service()/doGet()/doPost()-->**destory()
在访问某servlet时
1.执行构造方法一次
2.初始化一次,调用init()方法
3.调用service()方法,之后每次访问都会调用该方法。有该方法时,doGet和doPost失效。
如果没有该方法,会根据请求方式试图调用doGet或doPost,如果没有相应的方法,会出现405状态码,表示请求方式不允许
4.在当前servlet所在项目从tomcat中停止时,销毁一次,调用destory()方法
JSP
Java Server Page
使用Java开发、运行在服务器上的页面。
jsp文件的后缀名为".jsp"。
由于最初由servlet渲染页面,在Java代码中加入大量html的内容,使用极不方便。所以Sun公司推出了JSP,可以在页面中加入java代码,让页面成为动态页面。
JSP页面的本质是一个java文件(servlet)。
在访问某个jsp页面时,会让该页面重新编译为.java文件-->.class文件,所以第一次访问某个JSP页面时会慢一些。
JSP的组成
1.HTML元素
2.脚本(java代码)
<%java代码;%>
3.表达式
用于在页面中嵌入变量的值
<%=变量%>
4.指令
<%@ 指令名 属性="值" %>
page指令 用于设置当前页面的属性
include指令 用于引入其他页面
taglib指令 用于引入其他标签库
5.注释
<%-- jsp注释 --%>
在浏览器中可以查看html的注释,无法查看jsp的注释
6.声明
<%! 定义方法 %>
在<%%>中无法定义方法,如果非要在jsp页面中定义方法,需要使用声明。不建议在jsp页面中定义方法。
7.动作
jsp中定义了一些标签,可以代替某些java代码
绝对路径
<a href="localhost:8080/system/pages/hello.html">跳转</a>
相对路径问题
-
/
表示从根目录(域名+ip)出发
-
./
表示从当前位置出发
-
../
表示跳向上一层
如有index页面所在路径为
localhost:8080/system/pages/index.html
<a href="/hello.html">跳转</a>
这种方式,从根目录(localhost:8080)出发,会跳转到localhost:8080/hello.html
<a href="./hello.html">跳转</a>
这种方式,从当前位置(localhost:8080/system/pages)出发,会跳转到localhost:8080/system/pages/hello.html
<a href="../hello.html">跳转</a>
这种方式,从当前位置跳向上一层,会跳转到localhost:8080/system/hello.html
- 在jsp页面中,可以使用**${pageContex.request.contextPath}**表示页面上下文路径。
如项目默认上下文访问路径为localhost:8080/system
<a href="${pageContex.request.contextPath}/pages/hello.html">跳转</a>
以上路径相当于/system/pages/hello.html,即从根目录出发localhost:8080/system/pages/hello.html
如果在jsp页面中无法识别${},在<%@ page%>中加入isELIgnored="false"
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
四大作用域对象
作用域:共享数据的区域
pageContext
当前页面对象。共享数据区域范围为当前页面。
如果不在同一个页面,数据无法读取。
request
请求对象。共享数据区域范围为一次请求。
如果跳转中途使用了重定向,数据无法读取。
session
会话对象。会话是用户访问服务器时的某个时间段。
共享数据区域范围在这个时间段内,默认30分钟。
如果在指定时间内没有操作或销毁会话时,数据无法读取。
application
项目对象。共享数据区域范围为整个项目。
作用域范围
application > session > request > pageContext
以上四个作用域对象,都有这几个方法
//将某个对象obj保存到作用域中,命名为str
作用域对象.setAttribute(String str,Object obj);
//从某个作用域中获取保存的某个对象
Object obj = 作用域对象.getAttribute(String str);
//从某个作用域中移除某个保存的对象
作用域对象.removeAttribute(String str);
作用域对象的使用
在JSP页面中
作用域对象也称为内置对象,直接通过对应的单词使用
在servlet中使用
-
pageContext
servlet本身就是一个java类,在类中定义成员变量,就能在当前类中使用。
所以在servlet中不会使用pageContext对象
-
request
使用doGet/doPost/service方法中的HttpServletRequest参数req
-
session
//在servlet中使用session,需要通过请求对象request调用getSession()方法 HttpSession session= req.getSession();
-
application
//通过getServletContext()方法获取的ServletContext类型对象,就是当前项目对象 ServletContext application = getServletContext();
总结
- 在jsp页面中使用pageContext保存的数据,只能共享于当前页面
- 通常在servlet中查询后的数据保存在request中,使用请求转发跳转到其他页面,在对应的页面中数据数据
- 通常在登录后,将登录的用户保存在session中,无论用哪种方式跳转,都能从session中获取当时登录的用户。
- 在application中保存一些共享于整个项目中的数据
EL
Expression Language 表达式语言
是为了使JSP写起来更加简便,替换JSP中的<%=%>,简化了JSP页面中输出数据的操作。
主要输出保存在某个作用域中的数据。
特点
如果通过"某个作用域对象.setAttribute("cus",customer)"方法保存的对象,
在JSP页面中如果用表达式,使用<%=cus%>,如果用EL,使用**${cus}**输出。
会依次从pageContext-->reqeust-->session-->application中获取指定对象,
如果一旦从某个作用域中获取到了指定对象,就不再判断后续作用域。
也可以输出指定作用域中的对象。
-
只能输出保存在作用域中的对象
-
减少代码(省去了获取对象、转换的过程)
-
免去非空判断
- 如果某个要输出的对象不存在,不会输出null,而是输出空字符串""。
使用
在页面中输出保存在作用域中的对象
-
从作用域中依次查询并输出对象
${对象名}
-
从指定作用域中输出对象
作用域 对应作用域 代码 pageScope 当前页pageContex ${pageScope.对象} requestScope 请求request ${requestScope.对象} sessionScope 会话session ${sessionScope.对象} applicationScope 项目application ${applicationScope.对象} -
输出对象的属性
${对象名.属性名} ${对象名["属性名"]}
-
输出对象的方法返回值
${对象名.方法名()}
如在servlet中
Person p = new Person("admin","男",20);
request.setAttribute("p",p);
在页面中获取请求中的参数
用于获取表单提交的数据或超链接?后传递的数据。
使用${param.参数名}替换request.getParameter("参数")。
如有表单或超链接
<form action="page.jsp">
<input type="text" name="username">
<input type="submit">
</form>
<a href="page.jsp?username=admin">跳转</a>
在page.jsp中获取
<html>
<head></head>
<body>
<%-- 传统写法--%>
<% String username = request.getParameter("username");%>
<h3>
<%=username%>;
</h3>
<%--如果使用EL--%>
<h3>
${param.username}
</h3>
</body>
</html>
用于获取当前项目上下文(根目录+项目名)路径
如http://localhost:8080/Web03/就是一个项目上下文路径,
在JSP中使用**${pageContext.request.contextPath}**获取项目上下文路径
<form action="${pageContext.request.contextPath}/servlet映射">
</form>
<a href="${pageContext.request.contextPath}/页面路径">超链接</a>
注意
-
web.xml版本在4.0之后,在JSP中使用EL时,默认可以识别。
-
如果JSP无法识别EL,在指令(<%@ %>)中加入 isELIgnored="false"表示不忽略EL。
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
-
如果在使用EL过程中,出现PropertyNotFoundException异常,表示未发现指定属性,原因有
- 缺少指定属性
- 指定属性没有对应的get方法
JSTL
Java Server Page Standarded Tag Library JSP标准标签库
可以使用JSTL中的特定标签,来替换JSP中常见的Java代码。如循环判断等,减少Java代码,提高页面的可读性。
JSP内置对象
在jsp页面中有一些对象是已经定义好了可以直接使用的,称为内置对象。
一共有9个内置对象。
"rrppsoace"
- request
- 请求作用域对象
- response
- 响应对象
- pageContext
- 当前页作用域对象
- session
- 会话作用域对象
- page
- 当前jsp页面对象
- out
- 输出对象
- application
- 项目作用域对象
- config
- 配置对象
- exception
- 异常对象
Session和Cookie
这两个都是用于保存数据的对象。
session是一个作用域对象,在servlet中通过request.getSession()获取,在JSP中直接使用内置对象session获取。
cookie是一个对象,也是一个文件,保存在本地。
Cookie
cookie通常用于更长时间地保存一些信息,即便关闭浏览器,也能保存。
Session
session是一个作用域对象,在访问任意jsp页面时,默认就会创建一个session对象(可以通过设置取消自动创建)。