jsp环境搭建及入门
1.动态页面
2.架构
CS:client server
BS:browser server
3.Tomcat
文件位置:
- bin:可执行文件
- conf:配置文件
- lib:tomcat依赖的jar文件
- log:日志文件(记录出错的信息)
- temp:临时文件
- webapps:可执行的项目
- work:存放由jsp翻译成的java,以及编辑成的class文件
4.配置tomcat
端口号默认8080
5.访问tomcat
localhost:8080
- 常见状态码:
1.404:资源不存在
2.200:一切正常
3.403:权限不足
4.3xx:页面重定向
5.500:服务器内部错误(代码有误)
<% %>:放入Java代码
6(1).虚拟路径
方式1:
将Web项目配置到webapps之外的目录
- docBase:实际路径
- path:虚拟路径(绝对路径/相对路径)
方式2:
在目录中新xml文件
6(2).虚拟主机
域名解析器:将www编程IP地址
配置虚拟机
7.JSP执行流程
第一次访问:服务端将jsp解析成java,再解析成class文件
第二次访问:直接访问class文件(服务端代码修改,会重新编译)
使用eclipse开发
1.Eclipse创建的Web项目
浏览器可以直接访问WebContent的文件,但无法直接访问WEB-INF文件夹内文件,只能通过请求转发访问。
2.统一字符集编码
编码分类:
- 设置jsp文件的编码(pageEncoding属性)
- 设置浏览器读取jsp文件的编码(content属性)
一般使用国际化编码:UTF-8
文本编码
- 统一设置(推荐)
- 单独为项目设置编码
- 单位为文件设置编码
JSP的页面元素
- 脚本Script
1.<% %>:局部变量、java语句
2.<%! %>:定义全局变量、定义方法
3.<%= %>:输出表达式- 指令
1.page指令:<%@ page ... %>
2.page指定的属性
3.language:jsp页面使用的脚本语言
4.import:导入类
5.pageEncoding:jsp文件自身的编码
6.contentType:浏览器解析的编码- 注释
1.html注释:只有html注释可以被浏览器查看
2.java注释
3.jsp注释:<%-- --%>- JSP内置对象(自带的,不需要new也能使用的对象)
1.out:输出对象:向客户端输出内容
2.request:请求对象:存储“客户端向服务端发出请求信息(客户端到服务端)
request对象的常见方法:
(1)String Parameter(String name):根据请求的字段名key(input标签的name属性),返回字段值value
(2)String[] ParameterValues(String name):返回多个字段值value(checkbox)
(3)void setCharacterEncoding("编码格式"):设置请求编码
(4)getRequestDispatcher("路径").forward(request,response);:请求转发 的方式跳转页面
(5)getServerContext():获取项目的ServletContext对象
补充:
(1)get提交方式:method="get"和地址栏、超链接请求方式 默认都属于get提交方式
(2)get与post提交方式区别:get在地址栏显示请求信息;post不会显示
(3)文件上传一般用post,一般推荐也是post
3.response:响应对象(服务端到客户端)
response对象的常见方法:
(1)void addCookie(Cookie cookie):服务端向客服端增加一个cookie对象
(2)void sendRedirect(String location) throws IOEexception:页面跳转的一种方式
(3)void setContentType(String type):设置服务端响应的代码(设置服务端ContentType类型)
补充:
请求转发和重定向的区别:
(1) 请求转发地址栏不会改变,重定向会改变
(2) 请求转发会保留第一次请求的数据,重定向不会保留
(3) 请求转发的请求次数是1次,重定向为2次
(4) 请求转发跳转位置在服务端,重定向为客户端发生的第二次跳转
4.session(服务端)
补充:
Cookie(客户端,不是内置对象):由服务端产生,再发送给客户端保存。
作用:相当于本地缓存 服务端产生cookie本地缓存发送给客户端,提高效率。
缺点:安全性低
Cookie:key=value 由javax.servlet.http.Cookie产生
Cookie内置方法:
(1)public Cookie(String key,String value);
(2)String getName();
(3)String getValue();
(4)void setMaxAge(int expiry);:设置最大有效期(单位:s)
a.服务端发送给客服端cookie:response.addCookie(Cookie cookie);
b.页面跳转(转发、重定向)
c.客服端获取cookie:request.getCookies();
注意事项:
a.服务端增加cookie:response对象;客户端获取对象:request对象
b.不能直接获取某一个单独对象,只能一次性将全部cookie获取
c.通过F12可以发现,除了自己设置的cookie对象外,还有一个JSESSIONID的cookie
Session:会话
案例:
a.浏览网站:从开始到关闭称作一次会话
b.购物:浏览商品-下单-付款-退出称作一次会话
Session机制:- 客户端第一次请求服务端时,匹配失败后,服务端会产生一个session对象(用于保存该客户的信息);并且每个session对象都会有一个唯一的sessionId(用于区分其他session);服务端又会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务端sessionId的值;然后,服务端会在响应客户端的同时,将cookie发送给客户端,客户端就有一个cookie(JSESSIONID);因此,客户端的cookie和服务端的session一一对应(JSESSIONID-sessionId)。
- 客户端第n次请求服务端时,服务端先根据客户端cookie中的JSESSIONID去服务端的session中匹配sessionId,如果匹配成功,说明此用户不是第一次访问,不需要再次登录。
Session的核心要点:
a.session是储存在客户端。
b.session是在 同一个用户(客户)请求时 共享
c.实现机制:第一次客户请求时,产生一个sessionid并复制给cookie的JSESSIONID然后发送给客户端。最终,通过session的sessionid和cookie的JSESSIONID一一对应。
Session的基本方法:
(1)String getId():获取sessionId
(2)boolean isNew():判断用户是否是新用户(第一次访问)
(3)void invalidate():使session失效(退出登录、注销)
(4)void setAttribute()和Object getAttribute()属性
(5)void setMaxInactiveInternal(s):设置最大有效非活动时间
(6)int getMaxInactiveInternal():获取最大有效时间
cookie和session的区别
(1)保存的位置,cookie在客户端,session在服务端
(2)安全性,cookie较不安全,session较安全
(3)保存的内容,cookie放String,session放Object
5.application:全局对象
application的基本方法:
(1)String getContextPath();:虚拟路径
(2)String getRealPath(String name);:绝对路径(虚拟路径相对的绝对路径)
6.config
7.page
8.exception
9.pageContext(JSP页面容器)- 四种范围对(小-大):
pageContext:当前页面有效
request:同一次请求有效(请求转发有效,重定向无效)
session:同一次会话有效
application:全局有效(只是对于当前项目)
补充:
1.多个项目共享:JNDI可以做到
2.以上的四个范围,尽量使用最小的范围,范围越大,损耗越大
共有方法:
1.Object getAttribute(String name):根据属性名,获得属性值
2.void setAttribute(String name,Object obj):设置属性值(新增,修改)
3.void removeAttribute(String name):根据属性名删除对象
统一请求的编码 request
1,get方式请求 如果出现乱码
解决方法:
(1)统一每一个变量的编码
(2)修改server.xml,一次性的 更改tomcat默认get提交方式的编码 URLEncoding
注意:使用tomcat使,首先更改xml中的编码
2.post方式请求 如果出现乱码
解决方法:
request.setCharacterEncoding("UTF-8");
JDBC(Java Database Connectivity)
- 功能:可以为多种关系型数据库DBMS提供统一的访问方式
- 概念:
1.JDBC API:提供了各种各样的操作访问接口,Connection Statement PreparedStatement ResultSet
2.JDBC DriverManager:管理不同的数据库驱动
3.各种数据库驱动:各种数据库厂商提供(第三方提供),直接连接或操作数据库- JDBC API
主要功能:
1.与数据库建立连接
2.发送SQL语句
3.返回处理结果
具体方法/类/接口:
1.DriverManager(管理JDBC驱动)
2.Connection(连接,通过DriverManager产生)
Connection产生Statement操作数据库对象:createStatement()
Connection产生PreparedStatement操作数据库对象:prepareStatement()
Connection产生CallableStatement操作数据库对象:prepareCall()
3.Statement(PreparedStatement)(增删改查,通过Statement产生)
Statement操作数据库:
增删改:executeUpdate()
查询:executeQuery()
PreparedStatement操作数据库:
public interface PreparedStatement extends Statement
因此,增删改:executeUpdate()和查询:executeQuery()都有
特点:有很多赋值语句
4.CallableStatement(调用数据库中的存储过程或存储函数)
5.Result(返回的结果集)
提供方法:
1.next():光标下移,判断是否有下一条数据:true/false
2.preview()
3.getXxx():获取具体的字段值- JDBC访问数据库的基本步骤
1.导入驱动程序,加载具体的驱动类
2.与数据库建立连接
3.发送sql,执行
4.处理结果集(查询)- 数据库驱动
1.Oracle
(驱动jar:ojdbc-x.jar/具体驱动类:oracle.jdbc.OracleDriver)
(连接字符串:jdbc:oracle:thin:@localhost:1521:XE)
2.MySQL
(驱动jar:mysql-connector-java-x.jar/具体驱动类:com.mysql.jdbc.Driver)
(连接字符串:jdbc:mysql://localhost:3306/testdata)
3.SQLServer
(驱动类:sqljdbc-x.jar)
(连接字符串:数据库名/端口号)
补充:
使用JDBC操作数据库时,如果对数据库进行了更换,只需要替换驱动、具体驱动类、连接字符串、用户名、密码。- PreparedStatement与Statement在语法上的区别
1.Statement
sql-executeUpdate(sql)
2.PreparedStatement
(1)sql(可能存在占位符?)
(2)在创建PreparedStatement对象时,将sql预编译 PreparedStatement(sql)
(3)executeUpdate()
(4)setXxx()替换占位符?
3.推荐使用PreparedStatement
(1)编码更加简便
(2)提高性能(因为有预编译操作)
(3)安全(有效的防止sql注入)- JDBC总结(模板):
try{
1.导入驱动包、加载具体驱动类:Class.forName("具体驱动类");
2.与数据库建立连接:connection = DriverManager.getConnection(...)
3.通过connection,获取操作数据库的对象(Statement/PreparedStatement/...)
4.(查询)处理结果集:rs = pstmt.executeQuery();}
catch{抛出的异常:
1.ClassNotFoundException
2.SQLException
3.Exception}
finally{打开顺序与关闭顺序相反
1.(rs != null)rs.close();
2.(pstmt != null)pstmt.close();
3.(connection != null)connection.close();}
注意:
jdbc中除了Class.forName()抛出ClassNotFoundException,其余方法全部抛出SQLException。- CallableStatement:调用存储过程、存储函数
connection/prepareCall(存储过程或存储函数名)
参数格式:
1.存储过程(无返回值,用Out代替):{call 存储过程名(参数列表)}
2.存储函数(有返回值return):{? = call 存储函数名(参数列表)}- JDBC调用存储过程的步骤:
1.产生调用存储过程的对象:cstmt = connection.prepareCall("...");
2.通过setXxx方法处理输入参数值:cstmt.setInt(1, 10);
3.处理输出参数类型:cstmt.registerOutParameter(...);
4.执行:cstmt.execute();
5.接收输出值(返回值):cstmt.getInt(...);- JDBC调用存储函数的步骤(与调用存储函数的区别):
1.在调用时注意参数- 处理CLOB[Text]/BOLB类型
处理稍大型数据:
1.存储路径,通过JDBC存储文件路径,根据IO操作处理
2.使用CLOB和BLOB
(1)CLOB:大文本数据(小说->数据)
(2)BLOB:二进制文件(一切文件)- CLOB存取:
1.存
(1)先通过pstmt的?代替小说内容(占位符)
(2)再通过pstmt.setCharacterStream(2, reader,(int)file.length());将上一步?替换为小说流,注意第三个参数需要是Int类型
2.取
(1)通过Reader reader = rs.getCharacterStream("NOVEL");将CLOB类型的数据保存到Reader对象中
(2)将Reader通过Writer输出即可- BOLB存取: