今天在卸载印象笔记时候,偶然看到之前留存的相关学习笔记,
删除可惜,索性博客备份一下。
状态码
- 200:一切正常
- 300/301: 页面重定向
- 404:资源不存在
- 403:权限不够
- 500:服务器内部错误 代码写错了
JSP
- 建立一个webapp的所需条件
- 必须有web-inf
- lib 第三方依赖库
JSp是html嵌套java代码
配置虚拟路径
- 将web项目配置到webapps以外的项目
- conf/server.xml
1. server.xml
2.
3.
4. 访问path实际是docBase,相对路径是相对于appBase
5. 重启 - conf/Catalina/localhost
1. 项目名.xml
2. 内容写
3. 不需要重启
JSP执行流程
- 第一次访问:客户端提交给服务端jsp->java(servlet文件)->class
- 第二次未改变的条件下,直接运行class,改了就重复第一步
- 因为写servlet太慢了 才有了jsp 可以相互转换
JSP页面元素
- <% 定义局部变量%>
- <%! 定义全局变量、方法%>
- <%= 输出表达式%>
- 一般而言修改web.xml 、conf、java需要重启tomcat
- 修改jsp\html\css\js 不需要重启
- 即是修改服务端就重启服务端、客户端的需要不会需要重启
指令
page指令
<%@ page…%>
- language=“java” jsp页面的脚本语言
- import 导入类
- pageEncoding: jsp文件自身编码 jsp->java
- contenType:浏览器解析jsp的编码
注释
1. html注释 <!-- --> 可以被客户通过查看源码 所观察到
- java注释 // /。。。/
- sp注释 <%-- --%>
JSP九大内置对象(不需要new)
1. out:输出对象,向客户端输出对象
2. pageContext:
3. request:
- 请求对象。存储客户端向服务端的请求信息
- String getParameter(String name);key:value
- String[] getParameterValues(String name); key:values
- serCharacterEncoding("utf-8");设置请求的编码 (tomcat7以前默认 ios-88859-1,tomcat8以后utf-8)
- getRequestDispatcher(“b.jsp”).forward(requsest,response);请求转发 跳转页面 a->b
- getServerContext():获取当前项目的ServerletContext对象:
4. response
- void addCookie(Cookie cookie); 服务器向客户端增加cookie对象
- void sendRedirect(String location) throws IOException:页面跳转的一种方式(重定向
- void setContetType(String type):设置服务端响应的编码
-
请求转发
-
response.sendRedirect(“success.jsp”); 重定向
-
request.getRequestDispatcher(“success.jsp”).forward(request,response);请求转发
-
请求转发 | 重定向 | |
---|---|---|
地址栏是否改变 | 不变 | 改变 |
是否保留第一次请求时的数据 | 保留 | 不保留 |
请求的次数 | 一次 | 两次 |
5. session : 会话 (服务端)
- Cookie (客户端,不是内置对象) 是由服务端生成,再发给客户端保存
- 由javax.servlet.http.Cookie 类生成对象
- pulic Cookie(String name, String value)
- String getName();获取name
- String getValue();获取value
- void serMaxAge(int expiry) ;最大有效期
- response.addCookie(Cookie cookie)页面跳转 服务器准备cookie给客户端
- 客户端获取cookie : reques.getCookies(); 不能获取单独对象,只能一次性拿到全部的cookies
-
运行机制
- 第一次请求产生一个session 并且有sessionID(唯一) 值给到JSESSIONID 加到cookie
{ JSESSIONID:sessionID } 里面response回到客户端 - 即是通过cookie的JSESSIONID 与session的sessionID 实现客户端与服务端的一一对应
- 第二次和进行匹配sessionid
- 实为,每次都会进行匹配,因为并不知道你是第几次访问
- 第一次请求产生一个session 并且有sessionID(唯一) 值给到JSESSIONID 加到cookie
-
session方法:
- String getId():获取sessionid
- boolean isNew():判断是否为新用户 (第一次访问)
- void invalidate():使session失效 (退出登陆、注销)
- Object getAttribute()
-
cookie 与 session
session | cookie | |
---|---|---|
保存的位置 | 服务端 | 客户端 |
安全性 | 较安全 | 较不安全 |
保存的对象 | Object | Strin |
6. application 全局对象
7. config 配置对象 (服务器的配置信息)
8. page 当前jsp页面 对象 相当于java中的this
9. exception 异常对象
四种范围对象(小->大):
pageContext jsp页面容器
- 当前页面有效
- 页面跳转后无效
request 请求对象
- 同一次请求有效
- 请求转发有效、重定向无效
session 会话对象
- 同一次会话有效
- 关闭或者切换浏览器无效
appliation 全局对象
-
整个项目运行期间有效(切换浏览器仍然有效)
-
服务器关闭、其他项目无效
-
重启后仍然有效、多项目共享:JNDI
-
尽量使用最小的范围对象、因为对象的范围越大,造成的性能损耗越大
上述的四种对象的共有方法:
- Object getAttribute(String name):根据属性名,或者属性值
- void setAttribute(String name,Object obj):设置属性值(新增,修改)
- setAttribute(“a”,“b”) 如果a对象之前不存在,则新建一个a对象
如果a之前存在,则将值b赋给a
- setAttribute(“a”,“b”) 如果a对象之前不存在,则新建一个a对象
JDBC:Java DataBase Connectivity
- 可以为多种关系性数据库DBMS提供统一的访问方式
JDBC API:
- DriverManager 管理JDBC驱动
- Connection 连接,通过DriverManager产生
- Statment(PreparedStatement): 增删改查 通过Connection产生
- CallableStatement: 调用数据库中的存储过程/存储函数 (通过Connection产生)
- Result: 返回的结果集 (上面的Statement等产生)
JDBC使用的具体步骤
- 导入驱动,加载具体的驱动类
- 与数据库建立连接
- 发生SQL,执行
- 处理结果集
数据库驱动
驱动Jar | 具体驱动类 | 连接字符串 | |
---|---|---|---|
Oracle | ojdbc-x.jar | oracle.jdbc.OracleDriver | jdbc:oracle:thin:@localhost:1521:ORCL |
MySql | mysql-connector-java-x.jar | com.mysql.jdbc.Driver | jdbc:mysql://localhost:3306/数据库实例名 |
SqlServer | sqljdbc-x.jar | com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:microsoft:sqlserver:localhost:1433;databasename=实例名 |
常见方法
- Connection 产生操作数据库的对象
- connection.createStatement()
- connection.prepareStatement()
- connection.prepareCall()
- Statement操作数据库
- 增删改 executeUpdate()
- 查 executeQuerry()
- PreparedStatement操作数据库
- public Interface PreparedStatement extends Statement
- 具有Statement的功能
- 具有大量赋值set方法
- ResultSet 保存结果集
- next() 光标下移、判断是否有下一条数据:true/false
- previous(): true/flase
- getXXx(字段名|位置) 获取具体的字段值
- PreparedStatement与Statement的区别
- Statement 直接执行sql executeUpdate(sql)
- PreparedStatement 可能存在占位符?
- 在创建PreparedStatement对象的时候,将sql预编译PreparedStatement(sql)
- setXX()将刚才的占位符替换掉
- 执行PreparedStatement()就不需要sql了
- 推荐使用PreparedStatement
- 编码更加简洁
- 提高性能(预编译,只执行一次)
- 有效的防止sql注入吧
private static final String URL = "";
private static final String USERNAME = "";
private static final String PWD = "";
public static void update() {
Statement statement = null;
Connection connection = null;
try {
// 加载具体驱动类
Class.forName("");
// 与数据库建立连接
connection = DriverManager.getConnection(URL, USERNAME, PWD);
/*
发送SQL执行命令(增删改、查),,获取操作数据的对象
获取操作数据库的对象(Statement//preparedStatement//callablestatement)
*/
statement = connection.createStatement();
String sql = "";
int count = statement.executeUpdate(sql);
// 处理结果
if (count > 0) {
System.out.println("操作成功");
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (statement != null && connection != null) {
//先打开的后关闭
statement.close();
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
CallableStatement:调用 存取过程、存储函数
-
connection.preareCall(参数:存储过程或储存函数名)
参数格式:
存储过程(无返回值,用Out参数代替):
{call 存储过程名(参数列表)}
存储函数(有返回值return):
{ ?=call 存储函数名(参数列表) }
处理CLOB/BLOB类型
处理方式:
1. 存放路径
2. 直接存放
- clob:大文本数据(小说->数据)b
- blob:二进制文件(一切文件)
JavaBean
- 满足条件
- public修饰的类,无参构造
- 所有的属性都是private,并且提供get/set(如果是boolen,则get可以替换为is)
- 使用层面,分为两类
- 封装业务逻辑 (logindao.java封装了登陆逻辑)
- 封装数据 (实体类 person.java)
- 对应数据库中的一张表
- 封装业务逻辑、去操作封装的数据
- 可简化代码、提高复用
MVC
- M: Model 模型
- 功能
- 用JavaBean实现
- V: View 视图
- 用于展示、以及与用户交互
- 使用html、css、js、jsp 等前端技术实现
- C:Controller 控制器
- 分发器,将请求跳转到模型进行处理,模型处理完毕后,再将处理的结果返回给请求处
- 可以用jsp实现但是不推荐,一般建议使用serverlet实现
Servlet
- Java类必须符合一定的规范:
- 必须继承 java.servlet.http.HttpServlet
- 重写其中的doGet()和doPost()方法
- doGet()
- doPost()