JSP知识点

JSP教程

动态网页与静态网页
架构
client server(CS)
browser server(BS)

tomcat解压后目录
bin:可执行文件
conf: 配置文件
lib:tomcat依赖的jar文件
log:日志文件(记录出错等信息)
temp:临时文件
webapps:可执行项目
work:存放由jsp翻译成的java,以及编译成的class文件

常见状态码
404:资源不存在
200:一切正常
403:权限不足
300/301:页面重定向
500:服务器内部错误
jsp:在html中嵌套的java代码

在项目/WEB-INF/web.xml中设置默认的初始页面

/haha.jsp

虚拟路径和虚拟主机
将web项目配置到webapps以外的
docBase:实际路径
path:虚拟路径(绝对路径,相对路径)

虚拟主机

1.JSP的处理机制

  • browser发送http request 给 server
  • web server识别出这是一个对网页的请求。将该请求发送给jsp 引擎,通过使用url或者.jsp文件完成
  • JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet。这种转化只是简单地将所有模板文本改用 println() 语句,并且将所有的 JSP 元素转化成 Java 代码。
  • JSP 引擎将 Servlet 编译成可执行类,并且将原始请求传递给 Servlet 引擎。
    Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类。在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。
  • Web server以静态 HTML 网页的形式将 HTTP response 返回到您的浏览器中。
  • Web 浏览器处理 HTTP response 中动态产生的HTML网页,就好像在处理静态网页一样。

第一次请求会有翻译和编译的过程,因此会比较慢,再次访问直接访问class速度会比较快。如果更新jsp文件,会重新翻译和编译。
图1
2.JSP 生命周期

  • 编译阶段:
    servlet容器编译servlet源文件,生成servlet类
  • 初始化阶段:
    加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
  • 执行阶段:
    调用与JSP对应的servlet实例的服务方法
  • 销毁阶段:
    调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

WEB-INF中的文件,无法通过客户端直接访问,需要经过请求转发来访问。

配置tomcat运行时环境
jsp<->servlet
右键项目 ->build path -> add library -> server runtime

统一字符集编码
utf-8

JSP的页面元素
1.脚本scriptlet
i. <%
局部变量,java语句
%>
ii. <%!
全局变量,方法
%>
iii. <%=输出表达式%>
2.指令
page指令
<%@ page … %>
page指令属性:
language:jsp页面使用脚本语言
import:导入类
pageEncoding:jsp文件自身编码 jsp->java
contentType:浏览器解析jsp的编码

3.注释
html注释 可以被客户通过浏览器查看源码,所观察到
java注释 // //
jsp注释 <%-- --%>

9个JSP内置对象(自带的,不需要new也能使用的对象)
out: 输出对象,向客户端输出

pageContext

request: 请求对象;存储客户端向服务端发送的请求信息
request对象的常见方法
String getParameter(String name) 根据请求的字段名key,返回字段值value
String[] getParameterValues(String name): 根据请求的字段名Key,返回多个字段值
setCharacterEncoding(“utf-8”); 设置请求编码
(tomcat7或以前 默认编码 ISO-8859-1, tomcat8 utf-8)
getRequestDispatcher().forward(); 请求转发的方式跳转页面 A->B
getServerContext(); 获取项目的servletContext对象
统一请求编码
对于get 修改server.xml
URIEncoding=“UTF-8”
对于Post修改
request.setCharacterEncoding(“utf-8”);

response:响应对象;服务端响应客户端
提供方法:
void addCookie(Cookie cookie); 服务端向客户端增加一个cookie
void sendRedirect(String location) throws IOException; 页面跳转的一种方式重定向,导致数据丢失
void setContentType(String type); 设置服务端响应编码,设置服务端contentType类型
示例:登录
login.jsp check.jsp

session 服务端
session 会话
浏览网站:开始-关闭
购物:浏览 付款 退出
电子邮件:浏览,写邮件,退出
session机制:
客户端第一次请求服务端时,服务端会产生一个session对象(用于保存该客户的信息)并且每个session对象都会有一个唯一的sessionId(用于区分其他session);服务端又会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务端sessionId的值,然后服务端会在响应客户端的同时,将该cookie发送给客户端,至此客户端就有了一个cookie(JSESSIONID的值),因此客户端的cookie就可以和服务端的session一一对应(JSESSIONID-sessionID)
客户端第二/n次请求服务端时,服务端会先用客户端cookie中的JSESSIONID去服务端的sessionID中匹配sessionID,如果匹配成功,说明此用户不是第一次访问,无需登录。

例子:
客户端:顾客 (客户端)
服务端:存包处 -商场(服务端)
顾客第一次存包:商场 判断此人是否之前已经存过包(通过你手里是否有钥匙)。如果是新顾客(没钥匙),会分配一把钥匙给该顾客;钥匙会和柜子一一对应;
第二/n次存包:商场判断此人是之前已经存过包。
如果是老顾客(有钥匙),不需要分配;该顾客手里的钥匙会和柜子自动一一对应

session机制:
1.session存储在服务端
2.session是在同一个用户请求时共享
3.实现机制:第一次客户请求时产生一个sessionID并赋值给cookie的JSESSIONID然后发给客户端。最终通过session的sessionID和COOKIE的jsessionID实现一一对应

session方法:
String getID(); 获取sessionID
boolean isNew() 判断是否是新用户(第一次访问)
void invalidate() 使session失效(退出登录,注销)
setAttribute();
getAttribute();
void setMaxInactiveInterval(秒) 设置最大有效非活动时间
int getMaxInactiveInterval(秒) 获取最大有效非活动时间

示例:登录
request 数据同一次请求有效

cookie (客户端,不是内置对象) 需要new
Cookie是由服务端产生的,再发送给客户端保存
相当于本地缓存的作用:客户端->服务端
提高访问服务端的效率,但是安全性较差
name=value
servlet.http.Cookie
Cookie(String name,String value)
getName()
getValue()
setMaxAge(int expiry); 设置最大有效期(秒)
服务端准备cookie:
response.addCookie(Cookie cookie)
页面跳转(转发,重定向)
客户端获取cookie:request.getCookies();
服务端增加cookie: response对象;客户端获取对象:request对象
不能直接获取某一个单独对象,只能一次性将全部的cookie拿到
除了自己设置的Cookie对象外还有一个name为JSESSIONID的Cookie
使用Cookie实现记住用户名

application
config
page
exception

get提交方式:method="get"和地址栏请求方式都属于get提交方式
post提交方式和get请求方式区别
get方式在地址栏显示请求信息;
post不会显示
推荐使用Post

									请求转发           重定向

地址栏是否改变 不变 改变
是否保留第一次 保留 不保留
请求时的数据
请求的次数 1 2
跳转发生位置 服务端 客户端发出第二次跳转

转发:
张三(客户端) -> 服务窗口A(服务端) -> 服务窗口B
重定向:
张三(客户端)-> 服务窗口A(服务端)->去找B
张三(客户端)-> 服务窗口B(服务端)

1.JDBC API 提供各种操作访问接口,Connection Statement PreparedStatement ResultSet
2.JDBC DriverManager:管理不同的数据库驱动
3.各种数据库驱动
相应的数据库厂商提供的(第三方公司提供),连接/直接操作数据库

1.java程序与数据库建立连接
2.java程序发送SQL语句
3.数据库返回处理结果

DriverManager:管理jdbc驱动
Connection:连接
Statement(PreparedStatement):增删改查
CallableStatement:调用数据库中的存储过程/存储函数
Result:结果集

jdbc访问数据库的具体步骤
1.导入驱动,加载具体的驱动类
2.与数据库建立连接
3.发送sql,执行
4.处理结果集(查询)

数据库驱动
驱动jar 具体驱动类
Oracle ojdbc-x.jar oracle.jdbc.OracleDriver
MySQL mysql-connector-java-x.jar com.mysql.jdbc.Driver
SqlServer sqljdbc-x.jar com.microsoft.sqlserver.jdbc.SQLServerDriver
连接字符串
jdbc:oracle:thin:@localhost:1521:ORCL
jdbc:mysql://localhost:3306/数据库实例名
jdbc:microsoft:sqlserver:localhost:1433;databasename=数据库实例名

使用JDBC操作数据库时,如果对数据库进行了更换,只需要替换:驱动,具体驱动类,连接字符串,用户名,密码;

ResultSet:保存结果集
next() 光标下移,判断是否有下一条数据
previous() 上移
getXxx(字段名 | 位置) 获取具体的字段值,

connection产生操作数据库对象
Statement对象 createStatement()
PreparedStatement对象 prepareStatement()
callableStatement对象 prepareCall()

增删改 executeUpdate()
查询 executeQuery()

PreparedStatement与Statement在使用时的区别
Statement
sql
executeUpdate(sql)

PreparedStatement:
sql(可能存在占位符?)
在创建PreparedStatement对象时,将sql预编译,prepareStatement(sql)
executeUpdate()
setXxxx()替换占位符

推荐使用PreparedStatement:
1.PreparedStatement编码更加简便
2.提高性能(预编译只需要执行一次)
3.有效防止sql注入
sql注入:将客户输入的内容和开发人员的SQL语句混为一体

1.JDBC总结:
try{
a.导入驱动包,加载具体驱动类
Class.forName(“具体驱动类”);
b.与数据库建立连接
connection=DriverManager.getConnection(…);
c.通过connection获取操作数据库对象(Statement,PreparedStatement,CallableStatement)
d.(查询)处理结果集 rs=pstmt.executeQuery()
while(rs.next()){rs.getXxx(…);}
}catch(classNotfoundException e){

}catch(SQLException e){

}catch(Exception e){

}finally
//打开顺序与关闭顺序相反
if(rs!=null) rs.close();
(if stmt!=null) stmt.close();
(if connection!=null) connection.close();

jdbc中,除了class.forName()抛出ClassNotFoundException,其余方法全部抛SQLException

CallableStatement:调用存储过程,存储函数
connection.prepareCall(参数:存储过程或存储函数名)
参数格式:
存储过程(无返回值,用out参数替代):{ call 存储过程名(参数列表)}
存储函数(有返回值return):{?= call 存储函数名(参数列表)}

JDBC调用存储过程的步骤
产生调用存储过程的对象cstmt=connection.prepareCall(…)
setXxx(…)处理输出参数值cstmt.setInt(1,30);
通过registerOutParameter(…)处理输出参数类型
接受输出值(返回值)getXxx()
调存储函数

处理CLOB[TEXT]/BLOB类型
CLOB:大文本数据(小说->数据)
BLOB:二进制
先通过pstmt的?代替小说内容(占位符)
再通过pstmt.setCharacterStream(2,reader,(int)file.length());将上一步的?替换为小说流,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值