JSP实用教程(Web开发)
2021-07-21 19:05:57 41 举报
AI智能生成
包含Web网页开发基础知识点,学习后可以系统理解好MVC模式的应用,运用到经典案例“手机销售网”中。
作者其他创作
大纲/内容
JSP简介
TOMCAT服务器
配置端口
通过修改conf文件下的主配置文件server.xml来更改端口
8080是默认的端口
不可以把Tomcat服务器的端口修改为65536
可以是80
目录
bin:存放启动与关闭Tomcat的脚本文件
conf:存放Tomcat的各种配置文件,其中最主要的配置文件是server.xml
lib:存放Tomcat运行时所需的jar包
logs:存放Tomcat运行时的日志文件
webapps:存放Web应用程序,默认情况下把Web资源放于此目录
temp:存放Tomcat运行时所产生的临时文件
work:存放由JSP生成的Servlet源文件和字节码文件,由Tomcat自动生成
发布Web应用
直接放在Tomcat安装目录的webapps目录下
通过修改server.xml文件进行部署
在Tomcat安装目录下的conf文件夹中,打开server.xml
在</host>标签前面添加Context元素,将Web应用chapter05的配置信息加入Context元素中,如下所示
<Context path="/chapter05" docBase="D:\chapter05 " debug = "0" reloadable="true"> </Context>
path属性用于设置要发布的Web应用的访问路径,用于浏览器访问的URL中
docBase属性用于设置Web应用在本地磁盘中的实际路径,此处为D盘下的chapter05目录。
保存对server.xml的修改,双击startup.bat命令启动Tomcat
打开浏览器,访问http://localhost:8080/chapter05/welcome.html
创建配置文件进行部署
找到Tomcat安装目录下的conf目录,进入conf\Catalina\localhost文件夹
在localhost文件夹新建一个chapter05.xml文件
此处的<Context>元素少了path属性
这是因为此XML文件的名称被默认作为Web应用的访问路径名,无须再次设置path属性,即使强行设置也是无效的。
新建chapter05.xml文件后,双击startup.bat命令启动Tomcat
打开浏览器,访问http://localhost:8080/chapter05/welcome.html
JSP页面
保存
名字区分大小写
设置Web服务目录
根目录
安装目录是D:\apache-tomcat-9.0.26
根目录是D:\apache-tomcat-9.0.26\webapps\root
访问根目录的JSP页面时,URL格式是
http :// IP:端口 / JSP页面的名字
必须省略Web根目录的名字root
webapps下的Web服务目录
webapps目录下的任何一个子目录都可以作为一个Web服务目录
JSP保存到webapps下的Web服务目录中的URL格式
http :// IP:端口 / Web服务目录 / JSP页面的名字
在webapps下新建Web服务目录,不必重启Tomcat服务器
新建Web服务目录
打开主配置文件server.xml
找到</Host>的部分,在前面加入
<Context path = "/虚拟目录" docBase = "D:\服务目录" debug=“0” reloadable=“true”/>
主配置文件修改后,必须重新启动Tomcat服务器
相对目录
P8
JSP运行原理
JSP第一次被请求执行时 → Tomcat服务器根据JSP页面生成Java文件 → 编译成字节码文件 → 执行字节码文件响应用户请求
字节码的主要工作
把JSP页面中的HTML标记由客户的浏览器负责解释执行
P9
当这个JSP页面再次被请求执行时,Tomcat服务器直接执行字节码文件来响应用户
JSP页面的首次执行由服务器管理者来执行
JSP与Java Servlet的关系
Java Servlet就是Java类
JSP是以Java Servlet为基础
不是Java Servlet技术的全部
HTML与JavaScript
HTML
编写Web页面的语言
不体现数据的组织结构
描述数据的显示格式/提交方式
JavaScript
解释型的脚本语言,和Java语言没有关系
由浏览器解释执行
JSP语法
JSP页面的基本结构
组成
HTML标记、JavaScript标记
JSP标记
指令标记
动作标记
变量、方法的声明
Java程序片
Java表达式
声明变量、定义方法
位置
在JSP指令之后
<HTML>之前 或 <HTML>与</HTML>之间
声明变量
<%! %>之间的 在整个JSP页面都有效
与写的位置无关,但习惯上写到JSP页面的前面
定义方法
可在Java程序片中调用该方法
方法内声明的变量只在该方法内有效
定义类
可在Java程序片中使用该类创建对象
Java程序片
多个(多次)
可以出现方法调用语句
所调用的方法必须是JSP曾经定义的方法
不可以在这里定义方法
按顺序被执行
程序片中声明的变量
局部变量
与有效范围、声明的位置有关
是各个线程(用户)共享的变量,任何一个线程对JSP页面成员变量操作的结果,都会影响到其他用户
多线程处理程序片的特点
P22
synchronized修饰
同一时刻只能有一人访问这个变量/方法,以保证信息安全
Java表达式(JSP表达式)
JSP表达式可以直接把Java的表达式结果输出到JSP页面中
插入可求值的表达式
表达式的值由服务器计算
在JSP页面中,表达式的值表示成【字符串】的形式,发送给浏览器
因为网页中显示的文字都是字符串,所以表达式的最终运算结果将被转化为字符串类型
不可插入语句
“<%=”是一个完整的符号,“<%” 和“=”之间不能有空格,表达式结尾处不加分号
注释
HTML注释
用户能看到
用户的浏览器负责显示
JSP注释
用户看不到
JSP标记
JSP指令标记
page
定义整个JSP页面的属性、值
<%@ page 属性1=“属性1的值”%>
<%@ page 属性1=' 属性1的值 '%>
<%@ page 属性1=“属性1的值”属性2=“属性2的值”…%>
对整个JSP有效,与其书写的位置无关
具体某些属性
contentType属性
指当前是什么类型,拿什么去解析
网页形式
<%@ page contentType=“text/html”%>
当前浏览器要打开word文档
<%@ page contentType=“application/msword”%>
附加属性charset
通知用户,浏览器用怎样的编码解析收到的字符
JSP页面用page只能为contentType指定一个值
pageEncoding属性
指编码类型
<%@ page Encoding=“utf-8”%>
JSP页面用page只能为pageEncoding指定一个值
language属性
定义脚本语言
<%@ page language=“java”%>
import属性
引入Java运行环境提供的包中的类
<%@ page import=“java.io.* ”, “java.time.LocalDate”%>
默认
java.lang.*
javax.servlet.*
javax.servlet.jsp
javax.servlet.http.*
session属性
是否需要使用内置的session对象
默认true
buffer属性
指定out设置的缓冲区的大小/不适用缓冲区
<%@ page buffer=“8kb”%>
<%@ page buffer=“none”%>
autoFlush属性
指定out的缓冲区被填满时,是否自动刷新
isThreadSafe属性
设置访问JSP页面是否是线程安全的
true
JSP能同时相应多个用户的请求
false
JSP同一时刻只能响应一个用户的请求
info属性
为JSP页面准备一个常用但可能要经常修改的【字符串】
<%@ page info=“we are students”%>
可以在JSP中使用方法getServletInnfo( ); 来获取info属性的属性值
include
在JSP页面出现该指令的位置,静态嵌入一个文件,显得简洁
<%@ include file=“文件的URL”%>
文件的要求
编码要和当前JSP页面一致
如UTF-8
可访问/使用的
和JSP在同一Web服务目录中
文件的URL:文件的名字
在JSP页面所在的Web服务目录的1个子目录中
文件的URL:子目录/文件的名字
JSP动作标记
include
JSP运行时才将文件加入(动态包含一个文件)
表示方法
<jsp:include page=“文件的URL”/>
<jsp:include page=“文件的URL”>
param子标记
</ jsp:include>
param子标记
</ jsp:include>
包含的文件的类型
普通文本文件
将文件的内容发到用户端,由用户端的浏览器显示
JSP文件
Tomcat服务器执行,然后把执行结果发送到用户端
include指令标记、动作标记的区别
include指令标记
编译阶段就处理所需要的文件
文件的逻辑、语法依赖于当前的JSP
优点
执行速度快
把被包含的文件的内容放于包含文件中,组成一个文件后,编译运行
include动作标记
在JSP页面运行时才处理文件
文件的逻辑、语法独立于当前的JSP
优点
可以用param子标记更灵活地处理所需要的文件
缺点
执行速度慢
把被包含的文件的运行结果放于包含文件运行产生的结果中,这2个文件各自编译运行
param
以“名字-值”对的形式为其他标记提供附加信息
<jsp:param name=“参数” value=“<%=参数的值 %>”/>
可以在JSP中使用【String 参数=request.getParameter(“参数”); 】来获取参数的值
有需要的还要将string转为double【double 参数的值=Double.parseDouble(参数); 】
不能独立使用
forward
从该指令处停止当前页的执行,转向指定的JSP页面
表示方法
<jsp:forward page=“要转向的页面”/>
<jsp:forward page=“要转向的页面”>
param子标记
</ jsp:forward>
param子标记
</ jsp:forward>
使用forward动作标记转向后,尽管看到了转向后的页面的效果,但浏览器地址栏中显示的仍然是【转向前的JSP页面的URL地址】
useBean
Tag文件、标记
Tag文件
和JSP文件很类似,可以被JSP页面动态调用,实现代码的复用,但不希望别人访问
结构
扩展名“.tag”的文本文件
Tag文件的保存
Tag文件所在的目录
web服务目录 \ WEB-INF \ tags
某个Web服务目录下的JSP页面准备调用一个Tag文件,那么必须在该Web服务目录下
一个Tag文件必须保存到tags目录/其下的子目录中
Tag文件的编码
<% @ tag pageEncoding = "utf-8" %>
Tag标记
Tag标记与Tag文件
某个web服务目录下的Tag文件只能由该Web服务目录中的JSP页面调用
Tag标记的名字和Tag文件的名字一致
1个Tag文件对应1个Tag标记
自定义标记库(标记库)
全体Tag标记
表示方法
<Tag 文件的名字 />
<Tag 文件的名字 > 其他内容(标题内容) </Tag 文件的名字 >
Tag标记的使用
JSP页面通过用Tag标记来调用1个Tag文件
这之前要用taglib指令引入标记库
<% @ taglib tagdir = "标记的位置" perfix="前缀" %>
<computer : oddNumberSum / >
JSP内置对象
概念
为了简化开发,JSP内置了一些可以直接在脚本和表达式中使用的对象
不用声明就可以在JSP页面的Java程序片和表达式部分使用
如 request、response、session、application、out
request对象
封装了用户提交的信息,使用该对象可以获取用户提交的信息
实现了ServletRequest接口类的一个实例
接口:描述基本的动作(吃饭、睡觉)
通常用HTML的form表单请求访问服务器的JSP页面(/servlet),并提交必要信息给所请求的JSP页面(/servlet)
<form action = "请求的JSP/servlet" method=get | post>
…… 各种提交手段……
<input type = "xxx" name="xxx" value = "xxx" size=6 />
…… 提交键……
<input type = "submit" id="tom" name="submit" value = "提交" />
</form>
…… 各种提交手段……
<input type = "xxx" name="xxx" value = "xxx" size=6 />
…… 提交键……
<input type = "submit" id="tom" name="submit" value = "提交" />
</form>
<form action = " " (或单引号)method=get | post>
提交手段
</form>
提交手段
</form>
双引号、单引号中不能有空格
单击submit提交键向当前页面提交信息
request获取用户提交的信息
String sideA = request.getParameter( "input里的name" );
处理汉字信息
request.setCharacterEncoding( "utf-8" );
常用的方法举例
P66
处理HTML标记
form标记
<form action = "请求的JSP/servlet" method=get | post>
…… 各种提交手段……
<input type = "xxx" name="xxx" value = "xxx" size=6 />
…… 提交键……
<input type = "submit" id="tom" name="submit" value = "提交" />
</form>
…… 各种提交手段……
<input type = "xxx" name="xxx" value = "xxx" size=6 />
…… 提交键……
<input type = "submit" id="tom" name="submit" value = "提交" />
</form>
method属性取值
get
提交的信息会在提交的过程中显示在浏览器的地址栏中
post
提交的信息不会显示在浏览器的地址栏中
提交手段(中间那部分)
文本框
<input type = "text" name="boy" value = "ok" size=6 />
文本框的名字为boy
单击submit提交键向服务器JSP页面提交信息
列表
文本区
<textArea name="boy" id="xxx" rows=3 cols=50 >
<% = content (之前定义了的字符string) %>
</textArea>
<% = content (之前定义了的字符string) %>
</textArea>
JSP页面可以让request.getParameter(String s)方法,让参数s的取值是input里的文本框的名字“boy”,获取该表单通过文本框提交的value文本信息
request.getParameter("boy");
子标记,实现文本框、下拉列表、滚动列表
< input …/ >
< select …></ select>
< option …></ option>
< textArea …></ textArea>
input标记
指定form表单中数据的输入方式、提交键
空标记
没有开始标签、结束标签
<input type = "aaa" name="xxx" value = "xxx" />
“aaa”(GUI对象)
文本框text
<input type = "text" (指定的名字)name="xxx" (初始值)value = "xxx" (text的长度)size=" 5" (对齐方式)algin="left" (text可输入的最多字符)maxlength="9" />
用户没有在text输入任何信息,就提交
request获取value的初始值
若value没有指定,则为“”
单选框radio
<input type = "radio" (指定的名字)name="xxx" (初始值)value = "xxx" (对齐方式)algin="left" (验证是否被选上)checked="ok" />
如果radio的name取值相同,那么同一时刻只能有一个被选中
复选框checkbox
如果radio的name取值相同,那么同一时刻可有多个被选中
口令框password
用户输入的信息会用“*”显示,防止他人偷看口令
隐藏hidden
input没有可见的输入界面,form表单会将value的值提交给所请求的页面
提交键sumbit
单击提交键后,form表单请求的页面才有机会获取form表单提交的各个数据
一个form表单至少包含一个提交键
重置键reset
<input type = "reset" value = "重置" />
……
request通过name指定的名字“xxx”来获取 "aaa" 中提交的数据
select、option标记
定义
创建一个下拉式列表、滚动列表
option是select的子标记
<select id=tom name="myName" size="正整数">
<option value = "item1">文本描述</option>
<option value = "item2">文本描述</option>
……
</select>
<option value = "item1">文本描述</option>
<option value = "item2">文本描述</option>
……
</select>
textArea标记
能输入/显示多行文本的文本区
<textArea name="boy" id="xxx" rows=3 cols=50 >
<% = content (之前定义了的字符string) %>或文本描述
</textArea>
<% = content (之前定义了的字符string) %>或文本描述
</textArea>
style样式标记
<style>
#textstyle{
font-family:宋体;fonnt-size=18;clor:blue
}
</style>
#textstyle{
font-family:宋体;fonnt-size=18;clor:blue
}
</style>
table标记
以行列形式显示数据,不提供输入数据功能
<table border = "边框的宽度">
<tr width = "该行的宽度">
<th width = "单元格的宽度">单元格中的数据</th>
……
<td width = "单元格的宽度">单元格中的数据</td>
</tr>
……
</table>
<tr width = "该行的宽度">
<th width = "单元格的宽度">单元格中的数据</th>
……
<td width = "单元格的宽度">单元格中的数据</td>
</tr>
……
</table>
处理超链接
<a herf = "example4_9_receive.jsp ? id=A1001&price=88"> 购买 </a>
获得超链接传来的参数
String idStr=request.getParameter(“id”);
response对象
动态响应contentType属性
P79-80
HTTP文件头
用户访问一个页面时,会提交一个HTTP请求给Tomcat服务器
addHeader( String head,String value);
setHeader( String head,String value);
重定向
从一个页面跳转到sendRedict( URL , url)中url指定的页面
Tomcat服务器还是会把当前JSP页面执行完毕再重定向
但Tomcat不再给用户看当前页面的执行效果
session对象
(记录用户的信息)保存会话信息
session对象的id
用户首次访问JSP页面,Tomcat服务器会生成一个session对象
session对象调用相应的方法可以存储用户在访问JSP页面提交的各种信息
每个用户对应着一个session对象(用户的会话)
不同的用户的session对象不同
同一个用户在不同的Web服务目录中的session对象是互不相同的
session对象与URL重写
用户端浏览器支持cookie,才可以保证在不同网页之间的session是相同的
因为session对象被分配了一个string类型的id,Tomcat服务器把id存放到用户浏览器的cookie中
若不支持cookie,JSP页面可以通过URL重写来实现session对象的唯一性
通过向新的URL添加参数,把session对象的id传带过去
String str=response.encodeRedirectURL("example4_13_b . jsp");
将<form action = "example4_13_b . jsp" method=post>
改为
<form action = <% = str %> method=post>
使用session
P164
HttpSession session = request.getSession(true);
application对象
P90-91
config、pageContext、out、page、exception
JSP与JavaBean
概念
javaBean(bean)
是Java类
基于Java语言
通过封装属性、方法成为具有某种功能/处理某个业务的对象
不依赖平台
不是JSP内置对象
是一个可重复使用的软件组件
特点
实现代码的重复利用
易编写、维护、使用
可以在任何安装了Java环境的平台上使用,无须重新编译
JSP
调用bean完成数据的处理
将有关处理结果存放到bean中
显示bean中的数据
编写、使用JavaBean
类的命名规则
如果类的成员变量(bean的属性)的名字是xxx,为了获取/更改bean的值
public double getXxx( )
{ return xxx; }
{ return xxx; }
public void setXxx( double aaa)
{ xxx=aaa ; }
{ xxx=aaa ; }
类中定义的方法的访问权限都必须是public
类中必须有一个构造方法是public、无参数的
保存bean的字节码(.class)
P111
根据包名对应的路径,在WEB-INF\classes目录下再建立相应的子目录
如包名为tom.jiafei,则建立WEB-INF\classes\tom\jiafei
将创建bean的字节码文件,如Circle.class,复制到子目录中
可以直接按照bean的包名把bean的源文件(Circle.java)保存在子目录
用命令行进入父目录classes编译Circle.java
classes > javac tom\jiafei\Circle.java
classes > javac -cp servlet - api.jar tom\jiafei\Circle.java
创建、使用bean
使用(加载)bean
使用动作标记useBean
<jsp: useBean id="bean的名字" class="创建bean的类(要带有包名)" scope=“bean的有效范围”/ >
<jsp: useBean id="circle" class="com.servlet.Circle" scope=“page” / >
bean的加载原理
Tomcat服务器管理的pageContent内置对象中存在bean,就复制给JSP页面
没有查找到JSP动作标记要求的bean,就根据class指定的类创建一个bean,并添加到pageContent
修改了字节码文件,必须重新启动Tomcat服务器
bean的有效范围、生命周期
page bean
有效范围
访问的当前页面
存活时间
直到当前页面执行完毕
Tomcat服务器分配给每个JSP页面的page bean
不同的
尽管每个JSP页面的page bean的功能相同,但占用不同的内存空间
不同的用户(浏览器)的page bean
不同的
当2个用户同时访问一个JSP页面时,一个用户改变自己的page bean属性,不会影响到另一个用户
request bean
有效范围
请求的当前页面
存活时间
只在当前页面有效,直到响应结束
存活时间略>page bean
Tomcat服务器分配给每个JSP页面的~
不同的
一个页面改变,其他页面会受到影响
不同的用户(浏览器)的~
不同的
当2个用户同时访问一个Web服务目录时,一个用户改变自己的request bean属性,不会影响到另一个用户
session bean
有效范围
访问的Web服务目录下的各个页面
存活时间
直到浏览器关闭
Tomcat服务器分配给每个JSP页面id相同的~
相同的
一个页面改变,其他页面会受到影响
不同的用户(浏览器)的~
不同的
当2个用户同时访问一个Web服务目录时,一个用户改变自己的session bean属性,不会影响到另一个用户
1个用户在不同的Web服务目录的~
不同的
使用session bean,要保证用户端支持Cookie
application bean
有效范围
当前Web服务目录下的各个页面
存活时间
直到Tomcat服务器关闭
被访问该Web服务目录的所有用户共享
不同的用户(浏览器)的~
相同的
当2个用户同时访问一个Web服务目录时,一个用户改变自己的application bean属性,会影响到另一个用户
不用Web服务目录的application bean是不同的
获取、修改bean的属性
getProperty动作标记
获得bean的属性值,并将这个值用串的形式发送给浏览器
使用getProperty动作标记之前,必须要用useBean获得相应的bean
<jsp:getProperty name ="bean的id(哪个bean)" property=“bean的属性”/ >
没有value属性!!!
setProperty动作标记
设置bean的属性值
使用setProperty动作标记之前,必须要用useBean获得相应的bean
两种方法
将bean属性值设置为一个表达式的值 / 字符序列
<jsp:setProperty name ="bean的id" property=“bean的属性” value ="<% = expression %>" / >
<jsp:setProperty name ="bean的id" property=“bean的属性” value ="字符序列" / >
Java将字符序列转化为其他数值类型的方法
转化到int
Integer.parseInt( String s )
转化到float
Float.parseFloat( String s )
value的值的类型要和bean的属性的类型一致
通过HTTP表单的参数值来设置bean的相应属性值
用form表单的【所有】参数值设置bean的相对应属性值
<jsp:setProperty name ="bean的id的名字" property=“*” / >
用form表单的【某个】参数的值设置bean的某个属性值
<jsp:setProperty name ="bean的名字" property=“属性名” param="参数名" / >
不要求bean属性的名字必须和表单中某个参数名字相同
Java Servlet基础
servlet的部署、创建与运行
源文件、字节码文件
Servlet类
HttpServlet的子类
PrintWriter.out = response.getWriter( );
获得向用户发送数据的字符流
字节码文件(.class)的保存
P143类似于P111
保存到WEB-INF\classes\……
命令行语句(把源文件.java变为字节码.class)
classes > javac -cp servlet-api.jar moon\sun\Example6_1.java
classes > javac tom\jiafei\Circle.java
编写部署文件web.xml
保存到WEB-INF子目录中
结构
第一行
XML声明
<? xml version="1.0" encoding="utf-8" ?>
第二行
根标记
<web-app>
下一行
servlet标记
<servlet>……</servlet>
子标记
<servlet-name> hello </servlet-name>
servlet的名字
必须都不一样
<servlet-class> moon.sun.Example6 </servlet-class>
用哪个类创建servlet
下一段
servlet-mapping标记
<servlet-mapping>……</servlet-mapping>
<servlet-name> hello </servlet-name>
servlet的名字
与上面的name一样
<url-pattern> /lookHello </url-pattern>
/xxxxxx
在浏览器访问时输入的名字
最后一行
</web-app>
对于webapps下的Web服务目录,如果修改web.xml文件,不用重启Tomcat服务器
不是webapps下的Web服务目录,如果修改web.xml文件,重启Tomcat服务器
向servlet传递参数的值
浏览器输入url-pattern时,在后面加入参数及其值
url-pattern ? 参数1=值 & 参数2=值……
被请求的servlet就可以用request对象获取参数的值
request.getParameter(参数n)
servlet的工作原理
Tomcat服务器通过读取web.xml创建并运行servlet
多个用户同时请求一个servlet时,服务器为每个用户分别启动一个线程
servlet的生命周期
初始化一次,方法一个,服务多次
过程
初始化servlet
第一次被请求加载时,创建一个servlet,servlet调用init方法完成必要的初始化工作
init方法只被调用一次
public void init( ServletConfig config) throws ServletException
新诞生的servlet再调用service方法响应用户的请求
每个用户的每次请求都导致service方法被调用执行
public void service( HttpServletRequest request HttpServletResponse response)
HttpServletRequest类的对象
封装了用户的请求信息
HttpServletResponse类的对象
响应用户的请求
不同线程的service方法中的局部变量互不干扰
当服务器关闭,调用destroy方法销毁servlet
public destroy()
通过JSP页面访问servlet
请求一个servlet的方法
在浏览器输入url-pattern
通过JSP页面来请求
通过表单向servlet提交数据
如果url-pattern中写/computer
<form action = "computer">
</form>
</form>
加入参数
<form action = "computer ? sideA=10.66 & sideB=26">
</form>
</form>
通过超链接访问servlet
如果url-pattern中写/computer
<a herf = "computer"></a>
加入参数
<a herf = "computer ? mess=area&radius=<% =r %>">文本</a>
doGet方法、doPost方法
作用
处理用户的请求、作出响应
补充协议service方法,就需要在Servlet类中重写doPost和doGet方法来响应用户的请求
doGet方法会把参数传到.xml中,在浏览器的地址栏可以看见参数的增加
servlet的重写方法的规则
实际上service方法的功能
检查HTTP请求类型(get、post等)
并在service方法中根据用户的请求方式,在service方法中对应地调用doGet和doPost方法
如果不重写service方法,就要在Servlet类中重写doPost和doGet方法来响应用户的请求
doPost方法中编写处理过程
doGet方法中调用doPost方法
或
doGet方法中编写处理过程
doPost方法中调用doGet方法
重定向、转发
重定向
从当前JSP/servlet定向到另一个JSP/servlet
不带请求
无法用request获取用户提交的数据
方法
void sendRedirect(String location)
转发
对当前JSP/servlet的请求转发给另一个JSP/servlet
带请求
可以用request获取用户提交的数据
步骤
得到RequestDispatcher对象
RequestDispatcher dispatcher = request.getRequestDispatcher(" xxx.jsp 或 xxxServlet ");
转发
dispatcher.forward( request,response);
区别
转发
用户可以看到【转发】到的JSP页面/ servlet 的运行效果;
但在浏览器的地址栏【看不见】forward方法转发到的JSP页面的地址/ servlet的【地址】
看到的仍然是当前JSP页面的URL / servlet的url-pattern
如果刷新浏览器,那么请求将是当前的JSP页面 / servlet
当servlet执行forward方法实施【转发】时
Tomcat会【立刻结束】当前servlet的执行
重定向
当servlet执行sendRedict方法
时,Tomcat服务器要把【当前的servlet代码执行完毕】才实施重定向(跳转)操作
但Tomcat不给用户看当前servlet执行的效果
后,servlet紧接着执行了return语句,那么Tomcat服务器会立刻结束当前servlet的执行
使用转发的好处
可以让JSP和处理数据的servlet解耦
JSP只要和吃力转发的servlet打交道
利于Web应用程序的维护
MVC模式
构成
模型(bean,由servlet创建)
存储数据的对象
JavaBean
setXxx方法
getXxx方法
视图(jsp)
向控制器提交必要的数据、显示数据
控制器(servlet)
具体的业务逻辑
转发
RequestDispatcher
携带请求信息
重定向
不携带请求信息
模型的生命周期、视图更新
JSP+JavaBean模式
(获得)创建的bean
JSP通过用useBean标记
<jsp:usebean id = "名字" class = "创建bean的类" scope="生命周期"/>
MVC模式
创建bean
由控制器servlet创建bean,并将数据存到bean
显示bean的数据
JSP使用getProperty动作标记
<jsp: getProperty name = "名字" property = "bean的属性" />
bean的生命周期
request bean
servlet创建request bean的步骤
BeanClass类的某个构造方法创建bean对象
BeanClass bean = new BeanClass( );
将bean放到HttpServletRequest对象request中,并指定查找bean的id
request.setAttribute("名字" , bean );
取的id名字可为“keyword",值为bean的实例化
视图更新(servlet)
手段:转发
jsp页面
可以用如下标记获得servlet创建的request bean
<jsp : useBean id = "名字" class = "save.data.BeanClass" scope="request"/>
然后用相应的标记/Java程序片,显示request bean的数据
<jsp: getProperty name = "名字" property = "bean的变量" />
servlet请求一个jsp页面,显示jsp的数据
RequestDispatcher dispatcher = request.getRequestDispatcher("show.jsp");
dispatcher.forward( request,respone);
session bean
servlet创建session bean的步骤
BeanClass类的某个构造方法创建bean对象
BeanClass bean = new BeanClass( );
将bean放到HttpServletSession对象session中,并指定查找bean的id
HttpSession session = request.getSession(true);
session.setAttribute("名字" , bean );
视图更新(servlet)
各个jsp页面
可以用如下标记获得servlet创建的request bean
<jsp : useBean id = "名字" class = "save.data.BeanClass" scope="session"/>
然后用相应的标记/Java程序片,显示request bean的数据
<jsp: getProperty name = "名字" property = "bean的变量" />
servlet请求一个jsp页面,显示jsp的数据
手段:转发
RequestDispatcher dispatcher = request.getRequestDispatcher("show.jsp");
dispatcher.forward( request,respone);
手段:重定向
HttpServletResponse类中的重定向方法(sendRedirect)重定向到该页面
application bean
servlet创建application bean的步骤
BeanClass类的某个构造方法创建bean对象
BeanClass bean = new BeanClass( );
将所创建的bean放到服务器ServletContext内置对象中,并指定查找bean的id
getServletContext.setAttribute("名字" , bean );
视图更新(servlet)
各个jsp页面
可以用如下标记获得servlet创建的request bean
<jsp : useBean id = "名字" class = "save.data.BeanClass" scope="application"/>
然后用相应的标记/Java程序片,显示request bean的数据
<jsp: getProperty name = "名字" property = "bean的变量" />
servlet请求一个jsp页面,显示jsp的数据
手段:转发
RequestDispatcher dispatcher = request.getRequestDispatcher("show.jsp");
dispatcher.forward( request,respone);
手段:重定向
HttpServletResponse类中的重定向方法(sendRedirect)重定向到该页面
MVC模式的简单实例
P185
JDBC
概念
Java DataBase Connectivity(Java数据库连接)的简写
它是一套用于执行SQL语句的Java API,由一组用Java语言编写的类和接口组成,是Java程序访问数据库的标准规范
有了JDBC,开发人员无须为访问不同的数据库而编写不同的应用程序,只需要使用JDBC编写一个通用程序即可。
体系结构
JDBC API
面向程序,供Java程序开发人员使用
提供获取数据库连接、执行SQL语句、获得结果等功能
数据库驱动(连接器)不在JDBC API中,需要额外单独下载
JDBC Driver Manager
注册数据库驱动,供Java程序开发人员使用。
为应用程序装载数据库驱动,确保使用正确的驱动来访问每个数据源。
支持连接到多个异构数据库的多个并发驱动程序
JDBC Driver API
面向数据库,供数据库厂商使用。
提供了数据库厂商编写驱动程序时必须实现的接口
数据库
使用连接池
P246
连接池简介
创建若干个Connection对象放在一起
建立连接池
配置文件 context.xml
name
连接池的名字
</Resource……>
type
类型
javax.sql.DataSource
driverClassName
数据库连接器(数据库驱动的类)
MySQL8.0则为
com.mysql.cj.jdbc.Driver
url
设置连接数据库的URL
url要小些
里面的“&”要写成“&”
username
数据库用户名
root
password
maxActive
连接池的大小
maxIdle
minIdle
maxWait
使用连接池
Context接口
创建一个实现Context(上下文)接口的对象
Context context = new InitialContext( );
让context去找Tomcat服务器曾绑定在运行环境的另一个Context对象
Context contextNeeded = (Context) context.lookup("java:comp / env");
得到连接池
DataSource ds = ( DataSource) contextNeeded.lookup( "gxy" );
从连接池获得连接
Connection con = ds.getConnection( );
将连接池返回连接池
connection.close( );
不会关闭和数据库的TCP连接
仅仅只是把Connection对象返回到连接池
文件
RandomAccessFile类
对一个文件进行读写操作,就创建一个RandomAccessFile对象
可以读取文件数据
也可以向文件写入数据
两个构造方法
RandomAccessFile(String name,String mode);
name
文件名
mode
r(只读)
rw(读写)
RandomAccessFile(File file, String mode);
file
File的对象
mode
r(只读)
rw(读写)
0 条评论
下一页