javaWeb
jsp : java server page
就是用java开发网站
浏览器、服务器(B/s)模式
客户端/服务器(C/s)模式
C/s模式的弊端:
需要客户端软件,
升级不方便
有部分功能在客户端上的,自然就留了一个漏洞
也叫富客户端
因为部分功能在客户端,随着安装可以安装大量的相关资源。(贴图,模型,声音,视频。。。)
占用客户端的系统资源
B/S模式不需要安装客户端,单需要浏览器
虽然也安装了软件,但是是通用的
升级无需改变客户端浏览器的任何资料,所有工作,全部在服务端完成。
所有功能在服务器上,更安全。
也叫瘦客户端
功能不在客户端,无法完成华丽的游戏,不是B/S的长项
端游(c/s结构)/页游(B/S结构)
客户端应用程序(简称客户端):想服务器请求,并相应回来的结果
服务端应用程序(简称客户端):完成向客户端提供数据,功能处理,返回响应
浏览器:网页查看工具 在web中,通过HTML来实现用户界面
统称为软件
操作系统:windows\linux\MacOS...
管理其他软件和硬件交互
应用程序: office\WPS\QQ\端游
提供有针对性功能的软件
桌面应用程序:eclips\IDEA,办公软件
采用C/S结构开发,运行在桌面系统,或者无需网络功能,运行在桌面上
web应用程序:页游、电子商务、娱乐网站、门户网站、搜索引擎,各种管理系统
采用B/S结构开发,基于HTML网页形式的应用程序。(开发中需要重点关注如何生成这些网页)
服务器软件:(服务器操作系统),提供管理维护web应用程序的。也叫服务器环境
MySQL:数据库服务器软件。
Tomcat:提供web应用程序的管理和维护工作。也叫web容器。IIS(apsx)、Apache(html、PHP)
服务器:安装有服务器软件的计算机
Tomcat的下载和安装
安装格式exe:
压缩格式zip(tar.gz/rpm):通常用于Linux 优点换系统不用愁
1、安装就是解压缩
2、运行
2.1 TOMcat的目录结构:
bin
1、安装tomcat一定要对应适当的JDK版本,都是64位或者都是32位,并且版本不能相差太大,否则不支持
2、eclipse如果无法打开一种可能是需要配置环境,另一种是复制一份JRE到eclipse解压包里面去
3、tomcat安装好并配置好环境后,在命令窗口startup可以打开服务
4、打开服务后,新的项目需要放置在tomcat下的webapps目录下
5、放置好文件后打开浏览器输入 localhost:8080/复制过来的文件夹/.jsp格式的文件 即可打开项目
lesson2
在eclipse 的preference中搜索jre可以安装匹配多个jdk的jre
TCP/IP Monitor 打开位置在 window/show View/other 中搜索(网页开发表单post和get方式提交的时候需要应用到)
例子:
导入java类:
<%@page import="com.shengsiyuan.io.sample" %>
类的方法调用:
<%
sample.sayHello();
%>
如果是system.out.println()将会打印在控制台上
页面输出:
<%
String tmp=sample.sayHello(); //有返回值字符串时
out.println("<h3>"+tmp+"</h3>");
%>
JSP注释:
<%--JSP注释--%>
JSP设置java编译编码格式:
<%page contentType="text/html; charset=UTF-8" %>
设置浏览器编码格式:
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
两种编码格式必须保持一致
文件保存的时候指定编码:
<%page pageEncoding="UTF-8" %>
lesson3
jsp可以有HTML的所有代码
JSP声明 <%! 定义语句,如定义类、基本数据 %>java代码 注意只能放定于语句,不能尝试用任何方法包括new对象,也就是说非定义语句不能放入JSP声明中
例如 <%! public class A{ } %>
注意:JSP不能定义抽象的东西
JSP代码段 <% java代码 %> 例如构建类、方法调用
注意:以后定义属性时尽量避免首字符只有一个小写的标识符uName,以后的在EL中可能会出问题
JSP表达式:<%=java代码 %> 可以放属性和方法的调用语句
JSP表达式有一个特别的地方,java语句的结尾不能有“;” 也不可以有多句语句
JSP表达式的功能,就是输出语句,输出属性值或者方法的返回值
例如:<%="number="+number %> 类似于System.out.println();
JSP的工作原理:编辑源码->部署至服务器->启动服务器->通过浏览器访问
其实有很大一部分程序员并未参与,而是由容器自动完成的。
Tomcat(Web容易在JSP中完成了很大一部分工作)具体如下:
(1)查询并加载JSP文件,找不到资源直接报404的错误,404代码浏览器会解析为页面未找到
(2)转译:翻译(将JSP文件翻译成java文件)
(3)编译工作:将java文件编译成class文件
(4)执行:执行class文件,文件执行结果就是完整的HTML页面(所谓的动态,在javaWeb实际上是指内容动态,在这里java程序可以从数据库中获取数据,所以页面会变化)
(5)响应:将生成的结果HTML页面传输到浏览器
接下来由浏览器接班,负责解析HTML页面,并采用图形化的方式显示出来
lesson4
1、在eclipse中配置的tomcat,运行时配置文件存放在哪里?
放在工作空间的一些临时文件中:
用String path=request.getServletContext() 来获得
插件的配置信息 \.metadata\.plugins
web容器的插件信息 \org.eclipse.wst.server.core
对于不同的web项目服务器配置信息 \tmpX
相当于tomcat的webapps子文件夹 \wtwebapps
项目名称 \myApp
2、
java代码原样复制到java文件中
HTML代码以out对象的write()方法以字符形式输出在java文件中
HTML注释当做HTML代码处理
JSP注释在转译过程就已经被web容器的转译组件忽略了,即不写进java文件中,
JSP表达式在转译过程前面加上out.println(,后面加上),相当于把表达式的结果,使用out对象直接输出
转译过程中首先完成表达式的计算,其次使用out对象,直接输出
这就是为什么表达式后面不可以有分号,也不可以有多句语句
其实也可以理解,JSP表达式中的内容,作为out.print()方法的参数
JSP声明,转译到类中间,成为一个内部类,而JSP代码段转译到一个叫public void _jspservice()方法中,
因此声明中不能有方法调用等非定义语句,而代码段不能有定义语句
//TODO 将要完成的工作,主要帮助我们记住什么地方的工作未完成。
//FIXME 修复我, 主要是帮助我们记住什么地方可能有问题未处理,FIXME 优先级高一点,会排在前面
window/showview/other/task 查看所有TODO和FIXME
JSP指令
<%@ JSP指令 %> 给JSP下一些命令的功能
指令必须放在JSP的开头,同一个指令可以多行书写
常见的指令:
page指令 完成JSP的一些基本设置工作。比如说可以指定JSP的语言language属性,页面字符编码pageEncoding属性,页面内容字符编码contentType属性,
导入类import的属性 EL表达式支持的属性,指定错误页面的属性,
include指令 包含,在一个JSP页面中,可以引入另外一个JSP
taglib指令,标签库指令。在JSP页面当中,引用标签库
JSP 标准动作,类似HTML标签,也类似JSTL的标签库。动作实际上是标签
<jsp:xxx></jsp:xxx>
目前比较少用的有:
redirect 重定向
forward 转发
include 包含
《JSP设计》
lesson5 会话跟踪
什么是会话(session对象):
用专业的说法是浏览器与服务器之间,在某一个时间段内的,多次请求和响应的过程,我们叫会话
所谓会话实际可以理解为一组请求/响应过程。在某一个时间段内是指浏览器第一次向服务器发送消息开始,这个会话开启,
会话终止指服务器完成最后一次响应延迟多少时间以后。
会话的开启和终止是由web容器完成的。专业术语会话的实例化/销毁(开启和终止)
什么是请求/响应?(request对象和response对象)
简单的理解请求和响应,就是和浏览器和服务器之间的消息传递,以方向来区分请求和响应
浏览器向服务器发送消息,叫请求。服务器向浏览器发送消息,叫响应。
输出对象(out对象)将内容输出到页面上
String uName=request.getParameter("userName");
返回值是查询字符串的参数值
out.println("uName的值是:"+uName);
out.write()方法与print()一样
在浏览器的地址栏上输入的URL后面加一个“?userName=zhangsan”可以给JSP页面传递参数。
查询字符串:“?字符串”
查询字符串是一个标准的字符串。可以传递中文,但建议不要传递中文。因为URL的编码与否是由客户端浏览器决定的。
查询字符串的规则:参数名称=参数值
多个参数使用"&"符号隔开
HTML表单提交
通过表单提交如果method="get" 方式提交,其实就是以查询方式提交
如果表单提交 method=“post”方式提交,如果乱码,需要在JSP头部设置处理字符编码问题
<%
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
%>
post方式提交,可以传递大量文字信息,并且信息不会显示在浏览器上,安全性好
但是需要注意,采用post方式提交需要字符编码处理
eclipse工具:TCP/IP monitor
新建monitor
本地端口8088(未使用即可)
localhost
监听端口8080
<input type="hidden" name="pkID" value=""> 隐藏的信息也会随表单提交而传递
Lesson4
String path=reqest.getServletContext().getRealPath("/"); 获取eclipse中配置的tomcat,运行时的配置文件存放在哪里
工作空间下metadata是eclipse的所有配置文件
eclipse配置信息 metadata\.plugins
web容器的插件信息: \org.eclipse.wst.server.core
对于不同的web项目的配置信息: \tempXX
\wtpwebapps 相当于tompcat的webapps
temp是服务器运行临时文件
work是项目文件
Catalina\localhost\MyApp\org\apache\jsp 存放全部jsp文件对应的java文件和.class文件
lesson6 会话跟踪
传递信息方式
JSP/Servelet页面跳转方式
1. request.setAttribute("name",name);
<jsp:forward page="xxx.jsp"><jsp:forward>
或者推荐采用 reqest.getRequestDispatcher("xxx.jsp").forward(reqest,response);
web容器为每一次请求,都会分别创建一个请求对象request和一个响应对象response
response.sendRedirect("xxx.jsp") 采用页面重定向的方式,重定向不再携带attribute()
转发是一次请求,一次响应
重定向
相同点:都是完成页面跳转
结果都是后面的目标页面完成的
不同点:
转发是一次请求一次响应
重定向是两次请求两次响应
转发是浏览器显示第一个目标页面地址,重定向会在浏览器显示第二个目标页面地址
转发只能转发同意个网站页面上的,重定向可以转到其他网站上去
Lesson 7 JSP九个隐式对象
不需要实例化操作就可以获取的对象,叫做隐式对象
隐式对象都是由web容器负责实例化的
page
request
response
session
application
pageContext
config
exception
会话对象的创建和销毁(在JSP页面中是由web容器维护的,也意味着session的创建和销毁都是由web容器负责)
但是在servlet中不负责维护
cookie也可以跟踪会话,但是现在使用不多了
cookie的特点:
保存在客户端浏览器临时文件夹中,不占用服务器内存资源
cookie可以被客户端关闭
cookie不安全
cookie保存的是文本信息,无法保存过大内容,也无法保存二进制的内容
九大隐式对象分类
与输入输出有关:request, response,out
与作用域有关:pageContext request session application
与配置有关的: page(表示JSP页面本身的对象) config(表示页面本身的servlet的一些配置信息)
与异常有关:exception (必须页面指令为isErroPage=”true”) 当页面需要try…catch时才使用
相当于四个存放变量的区域:PageContext, request , session , application 表示作用域范围的对象,实际上提供了保存数据的空间
page对象表示JSP页面本身的对象
Lesson8 JSTL 标准标签库
分类:
核心标签库* :Core
国际化标签库 fmt
SQL标签库 sql
XML标签库 xml
目前就只有核心标签库还有使用
概念:标签库,每一个标签都能完成特定的工作,可以提高代码重用性,减少JSP页面代码量。
如何使用?需要使用taglib指令放在页面顶部<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=”C或者core等任意定义前缀” %>
下载jstl.jar包放在web-inf下
标签库的组成:由若干标签处理程序(*.class)加上标签描述文件(*.tld)组成。
每一个标准库都有三个版本的tld描述文件 可以寻找到c文件的url
标签库的使用
1、导入JSTL的支持包(jstl1.2.jar)
2、需要使用taglib指令引入标签库(定义prefix和uri)
3、采用<前缀:标签名><前缀:标签名/> 形式使用标签
forEach标签(迭代数组或者集合)
封装实体对象,通常包名:vo| pojo、 entity、 domain、 model、 bean
<prosay:forEach items=”${pageScope.myList}” var=”obj”>
<td>${obj.userId}</td>来获取
<td>${obj.userName}</td>
if标签
<porsay:if test=”${obj.userState}”>
<td>已经登录</td>
</prosay:if>
<porsay:if test=”${!obj.userState}”> 或者 <porsay:if test=”${not obj.userState}”>
<td>未登录</td>
</prosay:if>
choose … when…otherwise标签
<porsay:choose>
<porsay:when test=”${obj.userState}”>
<td>已经登录</td>
<porsay:when>
<porsay:when test=”${!obj.userState}”>
<td>未登录</td>
<porsay:when>
<porsay: otherwise>
<td>未登录</td>
</prosay:otherwise>
</porsay:choose>
forTokens标签
pageContext.setAttribute(“myStr”,str)
<prosay:forTokens item=”${myStr}” delims=”|” var=”subStr”>
<li>${subStr}</li>
</prosay:forTokens >
相当于String.split
重定向标签
<prosay:redirct url=”hello.jsp”></prosay:redirct>
param标签 是从查询字符串中获取数据(?xx1=xxxx&xxx2=xxxx)
<prosay:param name=”hello”></prosay:param>
Lesson 9 EL表达式
描述性的语言,作用是用来替代JSP的表达式
采用EL表达式替换JSP表达式原因:
1、JSP表达式容易造成语法混乱,导致出现<<>>等混乱
2、对于null值得处理,JSP表达式将会输出“null”字符串,容易造成歧义
3、EL使用在JSP页面上的。不是java代码,不能够放在代码段或者类当中
基本语法格式:
${表达式}
EL表达式对于页面来说非常友好,如果表达式处理过程中有问题,并不会抛出异常导致页面出错,而是直接忽略
EL的内置对象:
1、请求参数(从查询字符串中“url”后面的?xxx1=xxx&xxx2=xxx):
param, paramValues
2、与作用域相关的
pageScope, requestScope, sessionScope, applicationScope
3、与请求头部相关的:
header, headerValues
4、与初始化参数相关的
initParam
5、与cookie相关的:
cookie
6、与pageContext相: 功能可以获取到JSP中的隐式对象
pageContext
EL运算符号
算数运算符:+ -* / %
比较预算符 ==(eq)、!=(ne)、>、<、>=、<=
逻辑运算符 &&(and) ||(or) !(not)
其他运算符 空值判断(empty)、 三元运算符:条件?满足条件:不满足条件
()提升运算符优先级
EL功能:完成运算和输出功能
请注意:EL 表达式不能控制程序的流程,换句话说没有选择结构循环结构,程序流程结构我们通过JSTL来完成。
通过EL表达式获取对象,数组,集合中的数据
使用 ‘.’ 或者‘【】’来完成对象的属性调用,数组和集合的使用
${pageScope.user.userName}
${pageScope.user[“userNick”] }
相当于调用userName属性对应的get方法,也就是调用getUserName();
获取数组可以直接加下标
在EL表达式中,作用域可以省略不写,EL将自动从最小的作用域范围内查找属性
如果没找到返回空字符串
EL表达式会自动处理数据类型!
EL中的param对象
<c:forEach items=”${paramValues.type}” var=”typeStr”>
${typeStr}、
</c:forEach>
Lesson 10 servlet
Servlet的概述、配置
CGI(C语言) ASP(微软的VB) Servlet/JSP(sun的java) 三分天下
Applet(sun公司的)、Flash 两个动态插件
Servlet是什么
是一个用java编写运行在服务器上,处理基于请求与响应机制的动态页面的程序
servlet源码一定是一个.java文件
特殊性:
//创建一个servlet必须要 继承一个父类,实现其中的service抽象方法
// GenericServlet可以处理多种更不同协议的请求, 是一个抽象类
//网站是基于HTTP协议,所以提供一个子类HttpServlet
extends HttpServlet或者
extends GenericServlet{
@Override
public void service(ServletRequest request, ServletResponse response)
}
在HTTP协议中,主要使用的请求方式有两种(get/post)
所以在HTTPServlet的service方法中,针对不同的请求做了判断
最终,分别采用了两个空方法doGet和doPost来实现
out对象要注意关闭和清空缓冲流
out.flush();
out.close();
servlet编写:
继承一个类,重写若干方法(5选n)
web.xml 配置五个标签以及五个标签的嵌套关系
第二行是namespace命名空间,检查语法错误的
如果Servlet处理类没有放在一个指定包中,而是默认包,会发生什么?
如果重写service要记得加上super.service(req,res)让父类来判断是get或者是post
;
Servlet的生命周期
servlet对象的创建到销毁这一阶段叫做servlet的声明周期
按五个阶段:
1、实例化:实例化的工作室Tomcat做的
2、初始化 init方法
3、服务 service方法
4、销毁 destroy方法
5、不可用:实际上是JVM做的事,属于垃圾回收机制
Lesson 11 Java中的注解
@开头
注解的功能:告诉编译器,接下来的类、方法‘、属性的作用
@webServlet(name=”sayHello”,urlPatterns=”/servlet/sayHello.do”)
servlet的多重映射
允许给同一个servlet配置多个访问路径
除了独立的配置以外,还可以使用*通配符的方式完成多路径的映射
1、虚拟路径的形式支持通配符写法“/path/*”
2、虚拟文件的形式支持通配符的写法“*.filename”
servlet生命周期的方法
1、servlet对象是由web容器创建的
2、web容器在启动时并没有创建servlet对象
3、web容器在首次接受到访问servlet请求的时候创建servlet对象的
4、servlet对象创建完成过之后,将会自动调用init()方法完成初始化操作
5、完成初始化以后,通过service()方法处理请求
6、处理完成请求以后,该对象不会销毁,处于等待请求状态,等待下一次的请求 。下一次请求直接调用service方法
7、当web容器资源紧张的时候,即将垃圾回收时,会根据servlet对象有多长时间没有接收请求来判断,较长时间没有访问将会呗当成垃圾回收,或者是web容器在shutdown的时候,销毁servlet对象。
8、可以通过配置方式,让servlet在容器启动是预加载
<servlet>子标签 <load-on-startup>标签配置
查询字符串可能会用到的强制编码:
String str=”你好中国”
out.print(new String(str.getByte(“iso-8859-1”),”utf-8”))
原始编码 目标编码
9、生命周期的初始化参数,通过注解或者xml注解配置文件
通过servletConfig的对象调用getInitparameter()获取已经配置好的参数
lesson12 API
request.getRequestDispatcher(“xxx.jsp”);
request.getServletContext().getContextPath();获取上下文对象的路径
javaWeb
jsp : java server page
就是用java开发网站
浏览器、服务器(B/s)模式
客户端/服务器(C/s)模式
C/s模式的弊端:
需要客户端软件,
升级不方便
有部分功能在客户端上的,自然就留了一个漏洞
也叫富客户端
因为部分功能在客户端,随着安装可以安装大量的相关资源。(贴图,模型,声音,视频。。。)
占用客户端的系统资源
B/S模式不需要安装客户端,单需要浏览器
虽然也安装了软件,但是是通用的
升级无需改变客户端浏览器的任何资料,所有工作,全部在服务端完成。
所有功能在服务器上,更安全。
也叫瘦客户端
功能不在客户端,无法完成华丽的游戏,不是B/S的长项
端游(c/s结构)/页游(B/S结构)
客户端应用程序(简称客户端):想服务器请求,并相应回来的结果
服务端应用程序(简称客户端):完成向客户端提供数据,功能处理,返回响应
浏览器:网页查看工具 在web中,通过HTML来实现用户界面
统称为软件
操作系统:windows\linux\MacOS...
管理其他软件和硬件交互
应用程序: office\WPS\QQ\端游
提供有针对性功能的软件
桌面应用程序:eclips\IDEA,办公软件
采用C/S结构开发,运行在桌面系统,或者无需网络功能,运行在桌面上
web应用程序:页游、电子商务、娱乐网站、门户网站、搜索引擎,各种管理系统
采用B/S结构开发,基于HTML网页形式的应用程序。(开发中需要重点关注如何生成这些网页)
服务器软件:(服务器操作系统),提供管理维护web应用程序的。也叫服务器环境
MySQL:数据库服务器软件。
Tomcat:提供web应用程序的管理和维护工作。也叫web容器。IIS(apsx)、Apache(html、PHP)
服务器:安装有服务器软件的计算机
Tomcat的下载和安装
安装格式exe:
压缩格式zip(tar.gz/rpm):通常用于Linux 优点换系统不用愁
1、安装就是解压缩
2、运行
2.1 TOMcat的目录结构:
bin
1、安装tomcat一定要对应适当的JDK版本,都是64位或者都是32位,并且版本不能相差太大,否则不支持
2、eclipse如果无法打开一种可能是需要配置环境,另一种是复制一份JRE到eclipse解压包里面去
3、tomcat安装好并配置好环境后,在命令窗口startup可以打开服务
4、打开服务后,新的项目需要放置在tomcat下的webapps目录下
5、放置好文件后打开浏览器输入 localhost:8080/复制过来的文件夹/.jsp格式的文件 即可打开项目
lesson2
在eclipse 的preference中搜索jre可以安装匹配多个jdk的jre
TCP/IP Monitor 打开位置在 window/show View/other 中搜索(网页开发表单post和get方式提交的时候需要应用到)
例子:
导入java类:
<%@page import="com.shengsiyuan.io.sample" %>
类的方法调用:
<%
sample.sayHello();
%>
如果是system.out.println()将会打印在控制台上
页面输出:
<%
String tmp=sample.sayHello(); //有返回值字符串时
out.println("<h3>"+tmp+"</h3>");
%>
JSP注释:
<%--JSP注释--%>
JSP设置java编译编码格式:
<%page contentType="text/html; charset=UTF-8" %>
设置浏览器编码格式:
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
两种编码格式必须保持一致
文件保存的时候指定编码:
<%page pageEncoding="UTF-8" %>
lesson3
jsp可以有HTML的所有代码
JSP声明 <%! 定义语句,如定义类、基本数据 %>java代码 注意只能放定于语句,不能尝试用任何方法包括new对象,也就是说非定义语句不能放入JSP声明中
例如 <%! public class A{ } %>
注意:JSP不能定义抽象的东西
JSP代码段 <% java代码 %> 例如构建类、方法调用
注意:以后定义属性时尽量避免首字符只有一个小写的标识符uName,以后的在EL中可能会出问题
JSP表达式:<%=java代码 %> 可以放属性和方法的调用语句
JSP表达式有一个特别的地方,java语句的结尾不能有“;” 也不可以有多句语句
JSP表达式的功能,就是输出语句,输出属性值或者方法的返回值
例如:<%="number="+number %> 类似于System.out.println();
JSP的工作原理:编辑源码->部署至服务器->启动服务器->通过浏览器访问
其实有很大一部分程序员并未参与,而是由容器自动完成的。
Tomcat(Web容易在JSP中完成了很大一部分工作)具体如下:
(1)查询并加载JSP文件,找不到资源直接报404的错误,404代码浏览器会解析为页面未找到
(2)转译:翻译(将JSP文件翻译成java文件)
(3)编译工作:将java文件编译成class文件
(4)执行:执行class文件,文件执行结果就是完整的HTML页面(所谓的动态,在javaWeb实际上是指内容动态,在这里java程序可以从数据库中获取数据,所以页面会变化)
(5)响应:将生成的结果HTML页面传输到浏览器
接下来由浏览器接班,负责解析HTML页面,并采用图形化的方式显示出来
lesson4
1、在eclipse中配置的tomcat,运行时配置文件存放在哪里?
放在工作空间的一些临时文件中:
用String path=request.getServletContext() 来获得
插件的配置信息 \.metadata\.plugins
web容器的插件信息 \org.eclipse.wst.server.core
对于不同的web项目服务器配置信息 \tmpX
相当于tomcat的webapps子文件夹 \wtwebapps
项目名称 \myApp
2、
java代码原样复制到java文件中
HTML代码以out对象的write()方法以字符形式输出在java文件中
HTML注释当做HTML代码处理
JSP注释在转译过程就已经被web容器的转译组件忽略了,即不写进java文件中,
JSP表达式在转译过程前面加上out.println(,后面加上),相当于把表达式的结果,使用out对象直接输出
转译过程中首先完成表达式的计算,其次使用out对象,直接输出
这就是为什么表达式后面不可以有分号,也不可以有多句语句
其实也可以理解,JSP表达式中的内容,作为out.print()方法的参数
JSP声明,转译到类中间,成为一个内部类,而JSP代码段转译到一个叫public void _jspservice()方法中,
因此声明中不能有方法调用等非定义语句,而代码段不能有定义语句
//TODO 将要完成的工作,主要帮助我们记住什么地方的工作未完成。
//FIXME 修复我, 主要是帮助我们记住什么地方可能有问题未处理,FIXME 优先级高一点,会排在前面
window/showview/other/task 查看所有TODO和FIXME
JSP指令
<%@ JSP指令 %> 给JSP下一些命令的功能
指令必须放在JSP的开头,同一个指令可以多行书写
常见的指令:
page指令 完成JSP的一些基本设置工作。比如说可以指定JSP的语言language属性,页面字符编码pageEncoding属性,页面内容字符编码contentType属性,
导入类import的属性 EL表达式支持的属性,指定错误页面的属性,
include指令 包含,在一个JSP页面中,可以引入另外一个JSP
taglib指令,标签库指令。在JSP页面当中,引用标签库
JSP 标准动作,类似HTML标签,也类似JSTL的标签库。动作实际上是标签
<jsp:xxx></jsp:xxx>
目前比较少用的有:
redirect 重定向
forward 转发
include 包含
《JSP设计》
lesson5 会话跟踪
什么是会话(session对象):
用专业的说法是浏览器与服务器之间,在某一个时间段内的,多次请求和响应的过程,我们叫会话
所谓会话实际可以理解为一组请求/响应过程。在某一个时间段内是指浏览器第一次向服务器发送消息开始,这个会话开启,
会话终止指服务器完成最后一次响应延迟多少时间以后。
会话的开启和终止是由web容器完成的。专业术语会话的实例化/销毁(开启和终止)
什么是请求/响应?(request对象和response对象)
简单的理解请求和响应,就是和浏览器和服务器之间的消息传递,以方向来区分请求和响应
浏览器向服务器发送消息,叫请求。服务器向浏览器发送消息,叫响应。
输出对象(out对象)将内容输出到页面上
String uName=request.getParameter("userName");
返回值是查询字符串的参数值
out.println("uName的值是:"+uName);
out.write()方法与print()一样
在浏览器的地址栏上输入的URL后面加一个“?userName=zhangsan”可以给JSP页面传递参数。
查询字符串:“?字符串”
查询字符串是一个标准的字符串。可以传递中文,但建议不要传递中文。因为URL的编码与否是由客户端浏览器决定的。
查询字符串的规则:参数名称=参数值
多个参数使用"&"符号隔开
HTML表单提交
通过表单提交如果method="get" 方式提交,其实就是以查询方式提交
如果表单提交 method=“post”方式提交,如果乱码,需要在JSP头部设置处理字符编码问题
<%
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
%>
post方式提交,可以传递大量文字信息,并且信息不会显示在浏览器上,安全性好
但是需要注意,采用post方式提交需要字符编码处理
eclipse工具:TCP/IP monitor
新建monitor
本地端口8088(未使用即可)
localhost
监听端口8080
<input type="hidden" name="pkID" value=""> 隐藏的信息也会随表单提交而传递
Lesson4
String path=reqest.getServletContext().getRealPath("/"); 获取eclipse中配置的tomcat,运行时的配置文件存放在哪里
工作空间下metadata是eclipse的所有配置文件
eclipse配置信息 metadata\.plugins
web容器的插件信息: \org.eclipse.wst.server.core
对于不同的web项目的配置信息: \tempXX
\wtpwebapps 相当于tompcat的webapps
temp是服务器运行临时文件
work是项目文件
Catalina\localhost\MyApp\org\apache\jsp 存放全部jsp文件对应的java文件和.class文件
lesson6 会话跟踪
传递信息方式
JSP/Servelet页面跳转方式
1. request.setAttribute("name",name);
<jsp:forward page="xxx.jsp"><jsp:forward>
或者推荐采用 reqest.getRequestDispatcher("xxx.jsp").forward(reqest,response);
web容器为每一次请求,都会分别创建一个请求对象request和一个响应对象response
response.sendRedirect("xxx.jsp") 采用页面重定向的方式,重定向不再携带attribute()
转发是一次请求,一次响应
重定向
相同点:都是完成页面跳转
结果都是后面的目标页面完成的
不同点:
转发是一次请求一次响应
重定向是两次请求两次响应
转发是浏览器显示第一个目标页面地址,重定向会在浏览器显示第二个目标页面地址
转发只能转发同意个网站页面上的,重定向可以转到其他网站上去
Lesson 7 JSP九个隐式对象
不需要实例化操作就可以获取的对象,叫做隐式对象
隐式对象都是由web容器负责实例化的
page
request
response
session
application
pageContext
config
exception
会话对象的创建和销毁(在JSP页面中是由web容器维护的,也意味着session的创建和销毁都是由web容器负责)
但是在servlet中不负责维护
cookie也可以跟踪会话,但是现在使用不多了
cookie的特点:
保存在客户端浏览器临时文件夹中,不占用服务器内存资源
cookie可以被客户端关闭
cookie不安全
cookie保存的是文本信息,无法保存过大内容,也无法保存二进制的内容
九大隐式对象分类
与输入输出有关:request, response,out
与作用域有关:pageContext request session application
与配置有关的: page(表示JSP页面本身的对象) config(表示页面本身的servlet的一些配置信息)
与异常有关:exception (必须页面指令为isErroPage=”true”) 当页面需要try…catch时才使用
相当于四个存放变量的区域:PageContext, request , session , application 表示作用域范围的对象,实际上提供了保存数据的空间
page对象表示JSP页面本身的对象
Lesson8 JSTL 标准标签库
分类:
核心标签库* :Core
国际化标签库 fmt
SQL标签库 sql
XML标签库 xml
目前就只有核心标签库还有使用
概念:标签库,每一个标签都能完成特定的工作,可以提高代码重用性,减少JSP页面代码量。
如何使用?需要使用taglib指令放在页面顶部<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=”C或者core等任意定义前缀” %>
下载jstl.jar包放在web-inf下
标签库的组成:由若干标签处理程序(*.class)加上标签描述文件(*.tld)组成。
每一个标准库都有三个版本的tld描述文件 可以寻找到c文件的url
标签库的使用
1、导入JSTL的支持包(jstl1.2.jar)
2、需要使用taglib指令引入标签库(定义prefix和uri)
3、采用<前缀:标签名><前缀:标签名/> 形式使用标签
forEach标签(迭代数组或者集合)
封装实体对象,通常包名:vo| pojo、 entity、 domain、 model、 bean
<prosay:forEach items=”${pageScope.myList}” var=”obj”>
<td>${obj.userId}</td>来获取
<td>${obj.userName}</td>
if标签
<porsay:if test=”${obj.userState}”>
<td>已经登录</td>
</prosay:if>
<porsay:if test=”${!obj.userState}”> 或者 <porsay:if test=”${not obj.userState}”>
<td>未登录</td>
</prosay:if>
choose … when…otherwise标签
<porsay:choose>
<porsay:when test=”${obj.userState}”>
<td>已经登录</td>
<porsay:when>
<porsay:when test=”${!obj.userState}”>
<td>未登录</td>
<porsay:when>
<porsay: otherwise>
<td>未登录</td>
</prosay:otherwise>
</porsay:choose>
forTokens标签
pageContext.setAttribute(“myStr”,str)
<prosay:forTokens item=”${myStr}” delims=”|” var=”subStr”>
<li>${subStr}</li>
</prosay:forTokens >
相当于String.split
重定向标签
<prosay:redirct url=”hello.jsp”></prosay:redirct>
param标签 是从查询字符串中获取数据(?xx1=xxxx&xxx2=xxxx)
<prosay:param name=”hello”></prosay:param>
Lesson 9 EL表达式
描述性的语言,作用是用来替代JSP的表达式
采用EL表达式替换JSP表达式原因:
1、JSP表达式容易造成语法混乱,导致出现<<>>等混乱
2、对于null值得处理,JSP表达式将会输出“null”字符串,容易造成歧义
3、EL使用在JSP页面上的。不是java代码,不能够放在代码段或者类当中
基本语法格式:
${表达式}
EL表达式对于页面来说非常友好,如果表达式处理过程中有问题,并不会抛出异常导致页面出错,而是直接忽略
EL的内置对象:
1、请求参数(从查询字符串中“url”后面的?xxx1=xxx&xxx2=xxx):
param, paramValues
2、与作用域相关的
pageScope, requestScope, sessionScope, applicationScope
3、与请求头部相关的:
header, headerValues
4、与初始化参数相关的
initParam
5、与cookie相关的:
cookie
6、与pageContext相: 功能可以获取到JSP中的隐式对象
pageContext
EL运算符号
算数运算符:+ -* / %
比较预算符 ==(eq)、!=(ne)、>、<、>=、<=
逻辑运算符 &&(and) ||(or) !(not)
其他运算符 空值判断(empty)、 三元运算符:条件?满足条件:不满足条件
()提升运算符优先级
EL功能:完成运算和输出功能
请注意:EL 表达式不能控制程序的流程,换句话说没有选择结构循环结构,程序流程结构我们通过JSTL来完成。
通过EL表达式获取对象,数组,集合中的数据
使用 ‘.’ 或者‘【】’来完成对象的属性调用,数组和集合的使用
${pageScope.user.userName}
${pageScope.user[“userNick”] }
相当于调用userName属性对应的get方法,也就是调用getUserName();
获取数组可以直接加下标
在EL表达式中,作用域可以省略不写,EL将自动从最小的作用域范围内查找属性
如果没找到返回空字符串
EL表达式会自动处理数据类型!
EL中的param对象
<c:forEach items=”${paramValues.type}” var=”typeStr”>
${typeStr}、
</c:forEach>
Lesson 10 servlet
Servlet的概述、配置
CGI(C语言) ASP(微软的VB) Servlet/JSP(sun的java) 三分天下
Applet(sun公司的)、Flash 两个动态插件
Servlet是什么
是一个用java编写运行在服务器上,处理基于请求与响应机制的动态页面的程序
servlet源码一定是一个.java文件
特殊性:
//创建一个servlet必须要 继承一个父类,实现其中的service抽象方法
// GenericServlet可以处理多种更不同协议的请求, 是一个抽象类
//网站是基于HTTP协议,所以提供一个子类HttpServlet
extends HttpServlet或者
extends GenericServlet{
@Override
public void service(ServletRequest request, ServletResponse response)
}
在HTTP协议中,主要使用的请求方式有两种(get/post)
所以在HTTPServlet的service方法中,针对不同的请求做了判断
最终,分别采用了两个空方法doGet和doPost来实现
out对象要注意关闭和清空缓冲流
out.flush();
out.close();
servlet编写:
继承一个类,重写若干方法(5选n)
web.xml 配置五个标签以及五个标签的嵌套关系
第二行是namespace命名空间,检查语法错误的
如果Servlet处理类没有放在一个指定包中,而是默认包,会发生什么?
如果重写service要记得加上super.service(req,res)让父类来判断是get或者是post
;
Servlet的生命周期
servlet对象的创建到销毁这一阶段叫做servlet的声明周期
按五个阶段:
1、实例化:实例化的工作室Tomcat做的
2、初始化 init方法
3、服务 service方法
4、销毁 destroy方法
5、不可用:实际上是JVM做的事,属于垃圾回收机制
Lesson 11 Java中的注解
@开头
注解的功能:告诉编译器,接下来的类、方法‘、属性的作用
@webServlet(name=”sayHello”,urlPatterns=”/servlet/sayHello.do”)
servlet的多重映射
允许给同一个servlet配置多个访问路径
除了独立的配置以外,还可以使用*通配符的方式完成多路径的映射
1、虚拟路径的形式支持通配符写法“/path/*”
2、虚拟文件的形式支持通配符的写法“*.filename”
servlet生命周期的方法
1、servlet对象是由web容器创建的
2、web容器在启动时并没有创建servlet对象
3、web容器在首次接受到访问servlet请求的时候创建servlet对象的
4、servlet对象创建完成过之后,将会自动调用init()方法完成初始化操作
5、完成初始化以后,通过service()方法处理请求
6、处理完成请求以后,该对象不会销毁,处于等待请求状态,等待下一次的请求 。下一次请求直接调用service方法
7、当web容器资源紧张的时候,即将垃圾回收时,会根据servlet对象有多长时间没有接收请求来判断,较长时间没有访问将会呗当成垃圾回收,或者是web容器在shutdown的时候,销毁servlet对象。
8、可以通过配置方式,让servlet在容器启动是预加载
<servlet>子标签 <load-on-startup>标签配置
查询字符串可能会用到的强制编码:
String str=”你好中国”
out.print(new String(str.getByte(“iso-8859-1”),”utf-8”))
原始编码 目标编码
9、生命周期的初始化参数,通过注解或者xml注解配置文件
通过servletConfig的对象调用getInitparameter()获取已经配置好的参数
lesson12 API
request.getRequestDispatcher(“xxx.jsp”);
request.getServletContext().getContextPath();获取上下文对象的路径