文章目录
javaweb课堂笔记(一)
一、tomcat服务器
-
1、服务端组件
控制层:接收、分析、分发请求,转向视图组件,封装用户请求参数
业务层:Bean 处理请求
持久层:Dao 数据访问层,封装对外部数据的操作(数据库 文件)
视图层:对数据进行处理(渲染)处理结果数据,将处理结果用response回传
业务层与持久层分开:外部存储数据变换,降低业务层和持久层的耦合
web中间件:能自动执行web程序的程序,tomcat就是一个web中间件
初选模型:对象(只有属性没有方法)eg.结构体 -
2、环境变量
环境变量配置目的?
如果不配就要在bin目录下执行java、javac;配置环境变量可以在任何地方执行java、javac
注意:
CLASSPATH一定要配,虚拟机在执行过程中找到标准类库 eg. java.lang包
标准类库:JDK的lib目录下以jar为后缀的文件中 dt.jar tools.jar.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
-
3、端口
端口:在服务器中区别于其他应用程序的逻辑地址
mysql:3306
oracel:1521
sql Server:1433 -
4、客户端与服务端
客户端:发送请求 显示
HTTP:封装请求
服务端:接受请求 处理数据 显示结果
客户端->http->tomcat->组件 -
5、tomcat
概念:由java编写的一组程序
作用:自动通过web项目执行web组件
web服务器种类:tomcat WebLogic WebSphere(后两款性能更好) -
6、配置虚目录:
< Context path=“虚目录名” docBase=“真实地址”> -
7、注意问题
1.动态代码由浏览器执行
2.为什么要配置虚目录?
1)存在名字的不安全性(通过项目名知道文件名)
2)存在位置的不安全性(在webapps下)
3)出现存储溢出的问题;
3.在哪配置虚目录?
在tomcat中conf中找server.xml,在所有标签的结束符之前
4.如何配虚目录?
context标签中path属性=项目的虚名 用户在访问项目的虚名
docBase=项目对应的真实目录及路径
要重启tomcat 注意:一个真实目录可以对应多个虚项目名,一个虚项目名不可以访问多个目录
5.什么是虚目录?
用户访问的是虚的 用虚项目名访问真正项目对应目录就叫虚目录
6.System
System.out:标准字节输出流对象
将信息发给控制台(客户端)
System.in:标准字节输入流对象
二、JSP
1、JSP执行特点
由服务器执行,动态代码(原生Java程序),把执行结果嵌入到静态代码中,发给浏览器进行处理
静态代码+动态代码 (浏览器执行的都是静态代码)
JPS:作用:煊然 处理结果信息
2、JSP语法特点
- 1.注释
1)作用:便于维护、便于调试、便于开发
2)种类:
a.静态注释:对静态代码的注释,语法:<!-- -->
浏览器执行
b.动态注释:对动态代码的注释,语法:<%-- --%>
服务器执行 - 2.变量
<%
// 加! 全局变量:只初始化一次,本次是用的值是下次使用的初值,写在类中,要隐藏private
// 不加! 局部变量
%>
对象没有名字,有地址,对象的值就是地址
变量有名字
- 3.表达式
语法:<%= %>
向浏览器输出
两种输出的比较:
相同点:都由浏览器输出数据
不同点:
1)语法不同
java原生输出:<% out.println() %>
表达式输出:属于JSP语法
2)语法范畴不同
3)输出主体不同
out.println() out
内置对象 优缺点:安全性不高,可维护性不好
作业:打印99乘法表(右上三角)
<table border=1>
<%
for (int i = 9; i >= 1; i--) {
%>
<tr>
<%
for (int k = 1; k <= (9 - i); k++) {
%>
<td>
</td>
<%
}
for (int j = i; j >= 1; j--) {
if (i % 2 == 0) {
%>
<td>
<%
} else {
%>
<td>
<%
}
%>
<%=i * j%>
</td>
<%
}
}
%>
</tr>
</table>
</body>
4.指令
-
1.指令由什么执行?
jsp属于动态代码,由服务器执行 -
2.三种配置指令
语法:<%@ %>
1)page
<%@page %>
对当前页面属性进行处理(eg.静态编码 导包)
<%@ page contentType="text/html;charset=gb2312"%>
作用: 对当前页面的html和静态代码进行编码,所以配置指令使用静态编码
服务器端对静态代码做处理,配置指令只对当前页面有效
执行特点:只能写在上面,且只能写一条
2)指令
- A:include 指令
<%@include %>
包含页面至当前页面
语法:<%@include file="uri"%>
把file指定内容包含到当前页面, 为什么包含? 拥抱需求
动态注释:<%-- --%>
执行特点:1)先包含后执行 2)对被包含的页面类型没有要求
缺点
1)被包含页面不能与当前页面有相同的变量定义,否则tomcat出问题
2)被包含页面不能再出现html body,否则浏览器出问题
<%@ page contentType="text/html;charset=gb2312"%>
<body>
<%@include file="hello.jsp"%>
</body>
-
B:include标签
1)标签include 属于Java语法范畴
2)先执行后包含,避免变量冲突 前提:动态页面
3)缺点:执行只执行动态代码
4)当前页面可以通过request页面向被包含页面传参如果被包含页面为静态页面:
1)不能向当前页面传参
2)先包含,不执行eg. txt文件 if 执行:退化成指令include if 不执行:直接将动态代码发给浏览器
-
C:指令包含和标签包含区别 == (考试原题2)==
相同点:把被包含页面包含到当前页面
不同点:
1)语法不同
写法不同<%@ include file="uri"%> jsp <jsp:include page="uri"> java
语法范畴不同
指令:jsp
标签:java
2)执行流程不同
指令:先包含,后执行
标签:
动态页面:先执行后包含
静态页面:先包含不执行
3)对被包含页面是否识别
指令:不识别被包含页面类型
标签:识别被包含页面类型
4)传参
指令:当前页面不能向被包含页面传参
标签:动态:能
静态:不能
5)各自缺点
指令:
1.被包含页面不能和当前页面有相同变量名
2.被后包含页面不能由html body
标签:
1.避免被包含页面为静态页面,如果为静态页面,可能会向浏览器发送动态代码
2.不管被包含页面为动态或静态,都不能含有< html>< body>标签
结论:
如果没包含页面为动态页面,则采用标签包含,前提:把静态页面改为动态页面(没有html body)<%@ page contentType="test/html;charset=gb2312"%> <html> <body> int i = 100; %> <h1>i:<%%=i></h1> <%--jsp库下的include标签--%> <jsp:include page="include.jsp"/> </body> </html>
-
标签
java标签 => 找到标签描述文件 -t/d =>找到java程序
1.java程序
2.定义标签
3.将标签与Java程序关联标签执行的Java程序
标签相当于Java语法范畴标签语法特点:
<标签库:标签 />
为什么使用标签
不要在jsp中些原生java程序,用标签表示 -
tag标签
<%@taglib%>
引入标签库到当前页面 -
3、JSP的执行流程 (考试原题1)
1)启动tomcat
2)浏览器发请求 http://127.0.0.1:8080/hello.jsp
3)hello.jsp => hello_jsp.java (在work目录下)
4)调用javac把hello_jsp.java转换成hello_jsp.class
5)调用java执行字节码文件class,只执行动态代码
6)tomcat把动态代码的执行结果嵌入到静态代码中,发回给浏览器显示 -
4、JSP注意事项
1.jsp由谁来执行?
JSP:由服务器执行的页面2.修改jsp页面?
第二次修改.jsp文件,页面还是显示原来的,因为没有改变.class文件,而执行的是.class文件
做法:1)删除work文件 2)重启服务器3.jsp页面有什么组成?
JSP页面 = 静态代码+动态代码4.jsp能访问数据库吗?
JSP可以访问数据库,但最好不要用JSP访问数据库,难维护5.代码调试工具?
Junit6.如果jsp没有动态代码 或者 html内由动态代码,服务器将如何处理?
如果JSP没有动态代码,服务器也会处理,打开JSP文件,进行扫描,找动态代码,会占用服务器的时间
如果html有动态代码,服务器不会执行,直接跳过7.配置文件由谁来处理?
配置文件是由服务器来处理
配置文件的信息是思想、指导8.对象在哪里创建?
堆中不创建对象,在对象的属性空间开辟空间9.垃圾回收机制回收的是哪里的空间?
垃圾回收机制回收的是堆的空间
三、表单(登录)
1、表单
1.表单的优点?
1)方便接收用户请求参数,方便交互
2)自动生成http协议
2.表单请求内容?
http://127.0.0.1:8080/test/printTable01.jsp?rownum=5&colnum=8
post请求参数放在http协议体中,get请求参数放在协议头
post请求只能表单发送 优点: 安全不可见
3.socket采用的什么协议?
TCP协议
4.表单执行流程?
1)服务器请求 (服务器接收无状态的协议)
2)创建request,接收请求
3)tomcat通过项目到目录下找到处理请求的组件
4)request.getParameter(String rownum) 得到参数值
取得参数 => 转换参数 (int col = Integer.parseInt())=> 使用参数(for)
5)response
5.请求结束后会怎样?
1)所有请求结果放到http中,送回到浏览器
2)request response消失
2、异常
1、目的
使程序继续运行
2、try内代码有问题该怎么执行?
try内有问题代码,后面都不执行,直接进入catch
3、异常种类
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
方法未找到异常:NoSuchMethodException
4、空串和空的区别?
空串 “”:是对象,有属性和方法
null:不是
3、登录界面 1.0
login.jsp
用户名:username
密码:password
登录
control.jsp
1)取得用户名uname 取得密码upass
2)比较 if((“zhangshan”.equals(uname) ) && (“12346”.equals(upass)))
3) true => success.jsp <jsp:forward page=“success.jsp”> 取得用户名,登录成功
false => error.jsp <jsp:forward page=“error.jsp”> </jsp:forward>
四、九大内置对象
-
1、为了处理用户请求,由tomcat自动创建
作用:实现用户和服务器端数据的交互和传递 -
2、内置对象种类(九大内置对象)
1)request
请求范围:请求开始时开始 请求结束时销毁 ==> 请求范围,只在请求有效
作用:1)接收请求数据并进行传递 ;2)设定并传递后台属性
注意点:
1)服务端跳转 控制层向视图层跳转
2)一个用户在同一时刻只能发一个2)response
请求范围:request response 同时创建 同时结束
作用:1)把结果信息发给浏览器显示(jsp页面里)
2)设置协议头(可控制浏览器自动发请求)
3)完成客户端跳转,设置cookie3)session:表明用户的存在
1)生存周期:用户范围
第一次发请求访问服务器动态组件时创建,一个用户可以发多个请求,用户不存在销毁(用户下线)
2)作用:传递验证信息(安全性)
3)为什么不用session传递数据?
一个用户可有多个请求request
生存周期比request长,由用户决定,一个用户拥有唯一的session,当有多个用户时有多个session,则浪费内存空间
用户有多个session,使内存使用率过重,容易使内存崩溃
4)pageContext
1)生存周期:页面范围
2)作用:存放临时数据,不能传递数据
5)application (***)
1)生存周期:tomcat启动就创建application(一个),服务器关闭时销毁,服务范围
2)作用:存放公共信息
6)config
1)生存周期:服务范围
2)作用:传递配置信息
7)out(少)
向浏览器输出信息,尽量用reponse传递信息
不安全,不好用
8)exception(不用)
1)生存周期:服务范围
2)作用:传递异常信息
tomcat创建时会创建:application config exception,不依赖于用户请求j2ee jar包:tomcat/lib/servlet-api.jar
j2se j2ee api
五、request
-
1、request对象只接受http协议请求
-
2、request:形参类型与实参类型
// 持久层:数据库 变化会造成业务层变化 HttpServletRequestWrapper req = request //耦合性过强,增加维护的工作量 // HttpServletRequest 接口 HttpServletRequest req = request //降低耦合性
-
3、接收参数,传递参数(前提:服务端跳转,用户只发一次请求)
-
4、执行流程
requestDemo01.jsp
<%
request.setAttribute("name", "ZTE");
request.setAttribute("password", "123456");
%>
<jsp:forward page="requestDemo02.jsp"/>
=> 浏览器发送请求
=> 创建request内置对象 => 将参数放入request参数区 (key=age value=“String类型”)
=> 找到requestDemo01.jsp处理请求
=> 通过request设定属性,在属性区,值的类型为object (key=name value=“ZTE” key=password value=“123456” )
=> 服务端跳转到requestDemo02.jsp 用户不知道,还是之前那个请求
=> request拿到参数属性
-
5、跳转方式
1、服务端跳转(一次请求,在各个组件进行参数和属性的传递)
属性的保存范围
1) ☆ 最重要的概念:四种属性保存范围
1-1public void setAttribute(String name,Object value)
属性名称为字符串
属性值可以为任意对象
1-2public Object getAttribute(String name)
1-3前台参数getPrameter,后台属性setAttribute2) request
2-1 参数区:来自于Http请求
Key=age value=20
类型String
2-2 属性区:来自于服务端后台组件
Key=name value=”zte”
Key=password value=”123”
类型Object3)将属性保存在一次请求范围之内:
☆ 前提:必须使用服务器端跳转<jsp:forward/>
应用点:MVC设计模式、Struts、Webwork
例:requestDemo01.jsp、requestDemo02.jsp、requestDemo03.jsp3-1执行request01.jsp
http请求一来,Tomcat为请求创建request参数对象,Tomcat将请求数据设定在request参数区,request自动接收Tomcat设定的请求参数。
3-2服务器跳转到request02.jsp
取得参数,请求未结束,取得的参数结果不显示在浏览器
3-3服务器跳转到request03.jsp
执行request03.jsp,将参数结果传到浏览器上显示Tip 接收参数,传递参数,设定属性,服务端跳转。用户请求只发一次,传递的时候(服务端跳转,用户不知道)需要造型(强转)。
2、 客户端跳转(多次请求)
2-1 参数区:来自于Http请求
Key=age value=20
类型String
2-2 属性区:来自于服务端后台组件
Key=name value=”zte”
Key=password value=”123”
类型Object
3-1执行request01.jsp
http请求一来,Tomcat为请求创建request参数对象,Tomcat将请求数据设定在request参数区,request自动接收Tomcat设定的请求参数。
3-2服务器跳转到request02.jsp
取得参数,执行静态代码,取得的参数结果显示在浏览器,请求结束,则request销毁,
3-3服务器跳转到request03.jsp
用户再次发请求,创建一个新的request,里面参数为空,执行request03.jsp,将参数结果传到浏览器上显示为空。
Tip request在各个组件进行参数和属性的传递必须是服务端跳转。(getRequsetParame)
客户端跳转用户需要重新发请求,服务端跳转服务器自动在后台发请求。
在服务端,更安全,在服务端运行效率更高
request优点:
请求参数只有用request才能拿到用户信息,只有他有参数区,安全性高,执行效率高节省内存
六、Page
Page:只是存放临时数据,不能传递数据。
属性区:来自于Http请求
Key=age value=20
类型String
发送Http请求,Tomcat创建request内置对象,设定参数
访问JSP页面即创建page内置对象
一访问进入page02.jsp即创建新的page内置对象,因为page01.jsp内的page内置对象销毁,所以创建新的page对象参数值为空。
page返回页面创建,离开页面销毁
page范围:
在JSP中设置一个页的属性范围,必须通过pageContext完成
session
利用session来保存用户的信息
服务范围:用户范围
作用 只保留一个用户,主要用于验证用户是否登录
Application:
服务范围 Tomcat一启动就创建到服务器关闭时销毁,跨项目、用户、请求传数据
作用 传递公共信息
生命周期长,内存占用高,易使系统崩溃,安全性过低。
一般验证信息用session,分步收集用session(requset解决不了)。
动态编码:
动态静态代码区别
<%@ page contentType=“text/html;charset=gb2312”%> 只能处理静态编码(text/html)
<%汉字%>动态代码中的汉字成为动态编码
变成比特流,用ISO8859-1统一编码
String name = request.getParameter();
bytes[];
b = name.getBytes(“ISO8859-1”);变成字节数组对象
name = new String(b)
request.setCharacterEncoding(“GBK”)
String name = request.getParameter(“username”)
只对post请求 即协议体里面的汉字做编码
优点:代码量少
缺点:编码成功率不高
只对协议体里面的的汉字做编码