JDBC
-
说明
- JDBC规范定义接口,具体的实现由各大数据库厂商来实现
- 程序员如果要开发访问数据库的程序,只需要会调用JDBC接口中的方法即可,不用关注类是如何实现的。
- 使用同一套Java代码,进行少量的修改就可以访问其他JDBC支持的数据库
-
核心api
-
DriverManager类 管理和注册数据库驱动,得到数据库连接对象 Connection接口 一个连接对象,可用于创建Statement和PreparedStatement对象 Statement接口 一个SQL语句对象,用户SQL语句发送给数据库服务器 PreparedStatemem接口 一个SQL语句对象,是Stalement的子接口 REsultSet接口 用于封装数据库查询的结果集,返回给客户端java程序
-
-
导入驱动Jar包
- 下载JDBC的包
- 项目根目录新建lib目录,导入jar包
- 项目Model(模块)依赖中导入jar包
-
连接步骤
-
1、注册驱动 Class.forName(com.mysql.cj.jdbc.Driver); 2、创建数据库连接 url格式:jdbc:数据库://本地端口3306/数据库名?跨时区参数 username:数据库账号 password:密码 Connection conn = DriverManager.getConnection(url,username, password); 3、Connection获取Statement对象 4、使用Statement对象执行SQL语句 5、ResultSet接口 返回结果集 6、释放资源
-
Statement中的方法
-
executeUpdate(sql) 用于发送DML语句,增删改操作,参数为:sql语句、返回值为:影响行数 executeQuery(String sql) 用于发送DML语句,执行查询操作,参数为:sql语句、返回值为:影响行数
-
案例:
-
package JDBCDemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class CreateTable { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 创建连接 String url = "jdbc:mysql://localhost:3306/yii2basic?serverTimezone=Asia/Shanghai"; String username = "root"; String password = "root"; Connection conn = DriverManager.getConnection(url,username,password); System.out.println(conn); // 获取执行对象 Statement state = conn.createStatement(); // 执行sql语句 String sql = "update goods set num = 10 where id = 1 "; int result = state.executeUpdate(sql); System.out.println(result); } }
-
ResultSet接口
-
作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录
-
方法:
-
next() 指针向下移动1行,返回bool类型,如果还有下一条返回为true,否咋false get数据类型() 通过字段名,参数是String类型。返回不同的类型,通过列号,参数是整数,从1开始。返回不同的类型
-
数据库工具类JdbcUtils
-
把公共的方法单独封装
-
案例
-
package JDBCDemo; import java.sql.*; public class JdbcUtils { private static final String URL = "jdbc:mysql://localhost:3306/yii2basic?serverTimezone=Asia/Shanghai"; private static final String USERNAME = "root"; private static final String PASSWORD = "root"; private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; /* 注册驱动 */ static { try{ Class.forName(JdbcUtils.DRIVER); }catch (ClassNotFoundException e){ e.printStackTrace(); } } /* 创建数据库连接 */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(JdbcUtils.URL,JdbcUtils.USERNAME,JdbcUtils.PASSWORD); } /* 关闭所有打开的资源 */ public static void close (Connection connection, Statement statement) { if(statement != null){ try{ statement.close(); }catch (SQLException e){ e.printStackTrace(); } } if(connection != null){ try { connection.close(); }catch (SQLException e){ e.printStackTrace(); } } } /* 关闭所有打开的资源 */ public static void close (Connection connection, Statement statement,ResultSet resultSet) { if(resultSet != null){ try{ resultSet.close(); }catch (SQLException e){ e.printStackTrace(); } } } }
-
PreparedStatement接口
-
PreparedStatement 是 Statement 接口的子接口,继承于父类接口中的所有方法,他是一个预编译的sql语句 (效率较高)
-
方法
-
PreparedStatement prepareStatement(Stringsql) 指定预编译的sql语句,sql语句中使用占位符? 创建一个语句对象 int executeUpdate()执行DML,增删改的操作,返回影响的行数。 ResultSet executeQuery()执行DQL,查询的操作,返回结果集
-
-
优势
- prepareStatement()会先将SQL语句发送给数据库预编译
- PreparedStatement会引用着预编译后的结果。可以多次传入不同的参数
- PreparedStatement对象并执行。减少SQL编译次数,提高效率。2.安全性更高,没有SQL注入的隐患。3.提高了程序的可读性
-
步骤
- 编写SQL语句,未知内容使用?占位:“SELECT*FROMuserWHEREname=?ANDpassword=?”;
- 2)获得PreparedStatement对象
- 3)设置实际参数:setXxx(占位符的位置,真实的值)
- 4)执行参数化SQL语句5)关闭资源
事务处理
-
方法
-
setAutoCommit(boolean autoCommit) 参数是true/false 自动提交 commit() 提交事务 rollback() 回滚事务
-
连接池
- 其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
c3p0
-
安装
-
导入jar包 (两个) c3p0-0.9.5.2.jar 以及mchange-commons-java-0.2.12.jar
-
定义配置文件,src新建c3p0-config.xml
-
<c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <default-config> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///yii2basic?serverTimezone=UTC</property> <property name="user">root</property> <property name="password">root</property> <!-- 连接池参数 --> <!-- 初始化连接对象--> <property name="initialPoolSize">5</property> <!-- 最大的连接数--> <property name="maxPoolSize">10</property> <!-- 超时时间--> <property name="checkoutTimeout">3000</property> </default-config> <named-config name="otherc3p0"> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///yii2basic?serverTimezone=UTC</property> <property name="user">root</property> <property name="password">root</property> <!-- 连接池参数 --> <property name="initialPoolSize">5</property> <property name="maxPoolSize">8</property> <property name="checkoutTimeout">1000</property> </named-config> </c3p0-config>
-
-
项目模块中新增,导入的jar依赖
-
案例:
-
package JDBCDemo; import com.mchange.v2.c3p0.ComboPooledDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class C3P0Demo { public static void main(String[] args) throws SQLException { // 创建连接对象 ComboPooledDataSource ds = new ComboPooledDataSource(); Connection conn = ds.getConnection(); //System.out.println(conn); Statement statement = conn.createStatement(); String sql = "select * from user"; ResultSet res = statement.executeQuery(sql); while (res.next()){ String username=res.getString("username"); String password=res.getString("password"); System.out.println(username+"\t"+password+"\t"); } conn.close(); } }
-
Druid
-
安装
-
导入druid-1.0.9.jar包
-
项目模块引入包依赖
-
生成配置文件(存放src目录下边)
-
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/yii2basic?serverTimezone=UTC username=root password=root initialSize=5 maxActive=10 maxWait=3000
-
-
案例:
-
package JDBCDemo; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties; import JdbcUtils.*; public class DruidDemo { public static void main(String[] args) throws Exception { // 加载配置文件 Properties pro = new Properties(); pro.load(DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties")); // 获取连接资源 DataSource ds = DruidDataSourceFactory.createDataSource(pro); // 获取连接 Connection conn = ds.getConnection(); Statement statement = conn.createStatement(); String sql = "select * from user"; ResultSet res = statement.executeQuery(sql); while (res.next()){ String username=res.getString("username"); String password=res.getString("password"); System.out.println(username+"\t"+password+"\t"); } conn.close(); // Connection conn = JDBCUtils.getConnection(); // Statement statement = conn.createStatement(); // String sql = "select * from user"; // ResultSet res = statement.executeQuery(sql); // while (res.next()){ // String username=res.getString("username"); // String password=res.getString("password"); // System.out.println(username+"\t"+password+"\t"); // } // conn.close(); } }
-
-
spring JDBC
-
安装
- 导入包:commons-logging-1.2、spring-beans-5.0.0.RELEASE、spring-core-5.0.0.RELEASE、spring-jdbc-5.0.0.RELEASE、spring-tx-5.0.0.RELEASE
- 分别导入项目依赖
- 创建JdbcTemplate对象。依赖于数据源DataSource, JdbcTemplate template = new JdbcTemplate(ds); (可以基于封装的Druid类)
- 调用JdbcTemplate的方法来完成CRUD的操作
-
方法
-
update(): 执行DML语句。增、删、改语句,参数sql必填,其他未为占位符,对应的实参 queryForMap(): 查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合,注意:这个方法查询的结果集长度只能是1 queryForList(): 查询结果将结果集封装为list集合,注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中 query(): 查询结果,将结果封装为JavaBean对象, (1)query的参数:RowMapper (2)一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装new BeanPropertyRowMapper<类型>(类型.class) queryForObject: 查询结果,将结果封装为对象,一般用于聚合函数的查询,第一参数sql必填,第二,定影返回值类型对象,其他未为占位符,对应的实参
-
-
案例
-
package JDBCDemo; import org.springframework.jdbc.core.JdbcTemplate; import JdbcUtils.*; public class SpringDemo { public static void main(String[] args) { // 创建spring jdbc数据连接对象 JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); String sql = "update goods set num = 100 where id = 1"; int res = template.update(sql); System.out.println(res); } }
-
xml
-
安装
- 导入xml的jar包到lib目录下jsoup-1.11.2.jar
- 项目模块引入jar依赖
- 完成
-
步骤
- 导入jar包
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
-
案例
-
新建一个xml文件放置src目录下
-
package Xml; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; public class XmlDemo { public static void main(String[] args) throws IOException { // 获取 xml资源路径 String path = XmlDemo.class.getClassLoader().getResource("StudentsDemo.xml").getPath(); // 解析xml文档,加载文档进内存,获取dom树--->Document Document document = Jsoup.parse(new File(path), "utf-8"); //.获取元素对象 Element Elements elements = document.getElementsByTag("name"); //3.1获取第一个name的Element对象 Element element = elements.get(0); //3.2获取数据 String name = element.text(); System.out.println(name); } }
-
方法
-
Jsoup:工具类,可以解析html或xml文档,返回Document
-
parse:解析html或xml文档,返回Document parse(File in, String charsetName): 解析xml或html文件的。 parse(String html): 解析xml或html字符串 parse(URL url, int timeoutMillis): 通过网络路径获取指定的html或
-
-
Document:文档对象。代表内存中的dom树
-
获取Element对象 getElementById(String id): 根据id属性值获取唯一的element对象 getElementsByTag(String tagName): 根据标签名称获取元素对象集合 getElementsByAttribute(String key): 根据属性名称获取元素对象集合 getElementsByAttributeValue(String key, String value)根据对应的属性名和属性值获取元素对象集合
-
-
Elements:元素Element对象的集合。可以当做 ArrayList来使用
-
Element:元素对象
-
1. 获取子元素对象 * getElementById(String id):根据id属性值获取唯一的element对象 * getElementsByTag(String tagName):根据标签名称获取元素对象集合 * getElementsByAttribute(String key):根据属性名称获取元素对象集合 * getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合 2. 获取属性值 * String attr(String key):根据属性名称获取属性值 3. 获取文本内容 * String text():获取文本内容 * String html():获取标签体的所有内容(包括字标签的字符串内容)
-
Tomcat
1. 下载:http://tomcat.apache.org/
2. 安装:解压压缩包即可。
* 注意:安装目录建议不要有中文和空格
3. 卸载:删除目录就行了
4. 启动:
* bin/startup.bat ,双击运行该文件即可
* 访问:浏览器输入:http://localhost:8080 回车访问自己
http://别人的ip:8080 访问别人
* 可能遇到的问题:
1. 黑窗口一闪而过:
* 原因: 没有正确配置JAVA_HOME环境变量
* 解决方案:正确配置JAVA_HOME环境变量
2. 启动报错:
1. 暴力:找到占用的端口号,并且找到对应的进程,杀死该进程
* netstat -ano
2. 温柔:修改自身的端口号
* conf/server.xml
* <Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8445" />
* 一般会将tomcat的默认端口号修改为80。80端口号是http协议的默认端口号。
* 好处:在访问时,就不用输入端口号
5. 关闭:
1. 正常关闭:
* bin/shutdown.bat
* ctrl+c
2. 强制关闭:
* 点击启动窗口的×
6. 配置:
* 部署项目的方式:
1. 直接将项目放到webapps目录下即可。
* /hello:项目的访问路径-->虚拟目录
* 简化部署:将项目打成一个war包,再将war包放置到webapps目录下。
* war包会自动解压缩
2. 配置conf/server.xml文件
在<Host>标签体中配置
<Context docBase="D:\hello" path="/hehe" />
* docBase:项目存放的路径
* path:虚拟目录
3. 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写(推荐使用这个:热部署)
<Context docBase="D:\hello" />
* 虚拟目录:xml文件的名称
* 静态项目和动态项目:
* 目录结构
* java动态项目的目录结构:
-- 项目的根目录
-- WEB-INF目录:
-- web.xml:web项目的核心配置文件
-- classes目录:放置字节码文件的目录
-- lib目录:放置依赖的jar包
* 将Tomcat集成到IDEA中,并且创建JavaEE的项目,部署项目。
server applet
-
概念:运行在服务器端的小程序
- Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
- 将来我们自定义一个类,实现Servlet接口,复写方法。
-
安装
-
把servlet-api.jar包导入项目jdk里面
-
新建一个包,新建一个类继承Servlet接口,及实现其中的方法
-
配置Servlet,在web.xml中编辑配置
-
<!--配置Servlet --> <servlet> <servlet-name>demo1</servlet-name> 定义配置名 <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class> </servlet> <servlet-mapping> 映射属性 <servlet-name>demo1</servlet-name> 对应定义的配置名 <url-pattern>/demo1</url-pattern> url的资源路径 </servlet-mapping>
-
-
-
执行原理:
-
- 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
- 查找web.xml文件,是否有对应的标签体内容。
- 如果有,则在找到对应的全类名
- tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其方法
-
-
生命周期
- 被创建:执行init方法,只执行一次
- 提供服务:执行service方法,执行多次
- 被销毁:执行destroy方法,只执行一次
-
安全问题
- 尽量不要在Servlet类里面定义成员变量
- 每次访问service方法都会被调用一次
Servlet3注解
- 前提条件jdk6以上
- 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
- 定义一个类,实现Servlet接口
- 复写方法service方法输出内容
- 在类的上方@WebServlet(“路由”)
Servlet体系结构
GenericServlet 抽象类
- 将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
- 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
HttpServlet 抽象类
-
对http协议进行封装,只需重写方法即可
-
定义类继承HttpServlet
-
复写doGet/doPost方法既可以实现功能
-
一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
-
路径定义规则:
- /xxx:路径匹配
- /xxx/xxx:多层路径,目录结构
- *.do:扩展名匹配
-
http
- 概念
- 超文本传输协议
- 定义了,客户端和服务器端通信时,发送数据的格式
- 特点
- 基于TCP/IP的高级协议
- 默认端口号:80
- 基于请求/响应模型的:一次请求对应一次响应
- 无状态的:每次请求之间相互独立,不能交互数据
- 历史版本
- 1.0:每一次请求响应都会建立新的连接
- 1.1:复用连接
Request请求
- 主要是获取请求信息的一个类
体系结构
获取请求消息数据
-
获取请求行数据
-
String getMethod() 获取请求方式 String getContextPath() 获取虚拟目录 String getServletPath() 获取Servlet路径 String getQueryString(String name) 获取get方式请求参数 String getRequestURI(): 获取请求URI String getProtocol() 获取协议及版本 String getRemoteAddr() 获取客户机的IP地址
-
-
获取请求头
-
String getHeader(String name) 通过请求头的名称获取请求头的值 Enumeration<String> getHeaderNames() 获取所有的请求头名称
-
-
获取请求体数据
- 获取流对象
- BufferedReader getReader():获取字符输入流,只能操作字符数据
- ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
- 再从流对象中拿数据
- 获取流对象
其他功能
-
1. String getParameter(String name): 根据参数名称获取参数值 username=zs&password=123 2. String[] getParameterValues(String name): 根据参数名称获取参数值的数组,一般用于表单的复选框 hobby=xx&hobby=game 3. Enumeration<String> getParameterNames(): 获取所有请求的参数名称 4. Map<String,String[]> getParameterMap(): 获取所有参数的map集合 // 中文乱码 get方式:tomcat 8 已经将get方式乱码问题解决了 post方式:会乱码 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8"); // 请求转发:一种在服务器内部的资源跳转方式 1. 步骤: 1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path) 2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 2. 特点: 1. 浏览器地址栏路径不发生变化 2. 只能转发到当前服务器内部资源中。 3. 转发是一次请求 // 共享数据:域对象:一个有作用范围的对象,可以在范围内共享数据 * request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据 * 方法: 1. void setAttribute(String key,Object value):存储数据 2. Object getAttitude(String key):通过键获取值 3. void removeAttribute(String name):通过键移除键值对 // 获取ServletContext: ServletContext getServletContext()
封装请求参数类
-
简化数据封装
-
安装 导入BeanUtils包 1、创建实体类 2、获取请求参数到map集合 3、使用BeanUtils类的方法populate(mian,params)
-
-
方法
-
1. setProperty() 2. getProperty() 3. populate(Object obj , Map map): 将map集合的键值对信息,封装到对应的JavaBean对象中
-
-
实体类注意事项
-
1. 类必须被public修饰 2. 必须提供空参的构造器 3. 成员变量必须使用private修饰 4. 提供公共setter和getter方法
-
Response响应
-
响应
-
数据格式: 1. 请求行 2. 请求头 3. 请求空行 4. 请求体
-
-
* 功能:设置响应消息 1. 设置响应行 1. 格式:HTTP/1.1 200 ok 2. 设置状态码:setStatus(int sc) 2. 设置响应头:setHeader(String name, String value) 3. 设置响应体: * 使用步骤: 1. 获取输出流 * 字符输出流:PrintWriter getWriter() * 字节输出流:ServletOutputStream getOutputStream() 2. 使用输出流,将数据输出到客户端浏览器 4、乱码问题: 1. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1 2. 设置该流的默认编码 3. 告诉浏览器响应体使用的编码 //简单的形式,设置编码,是在获取流之前设置 response.setContentType("text/html;charset=utf-8");
-
案例
-
package cn.itcast.web.Response; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/ResDemo") public class ResponseDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我是demo1"); //设置响应行 // 这种方式是通过http状态实现重定向 // resp.setStatus(302); //设置响应头 //resp.setHeader("location","/ResDemo2"); //设置响应体 // 直接使用重定向方法 // resp.sendRedirect("/ResDemo2"); // 获取输出流 resp.setContentType("text/html;charset=utf-8"); PrintWriter printWriter = resp.getWriter(); // 输出数据 printWriter.write("输出成功,<br>"); printWriter.write("输出成功1111111"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
-
ServletContext对象
-
概念:代表整个web应用,可以和程序的容器(服务器)来通信
-
获取
- 通过request对象获取
- request.getServletContext();
- 通过HttpServlet获取
- this.getServletContext();
- 通过request对象获取
-
功能
-
功能: 1. 获取MIME类型: * MIME类型:在互联网通信过程中定义的一种文件数据类型 * 格式: 大类型/小类型 text/html image/jpeg * 获取:String getMimeType(String file) 2. 域对象:共享数据 1. setAttribute(String name,Object value) 2. getAttribute(String name) 3. removeAttribute(String name) * ServletContext对象范围:所有用户所有请求的数据 3. 获取文件的真实(服务器)路径 1. 方法:String getRealPath(String path) String b = context.getRealPath("/b.txt");//web目录下资源访问 System.out.println(b); String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问 System.out.println(c); String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问 System.out.println(a);
-
Cookie
-
方法:
-
快速入门: * 使用步骤: 1. 创建Cookie对象,绑定数据 * new Cookie(String name, String value) 2. 发送Cookie对象 * response.addCookie(Cookie cookie) 3. 获取Cookie,拿到数据 * Cookie[] request.getCookies() 获取所有cookie到数组 cookie.getname() 获取名字 cookoe.getValue() 获取cookie值 cookie.setMaxAge() 设置存活时间 4、如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。 Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); response.addCookie(c);
-
-
案例
-
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie c = new Cookie("name","须臾钱"); resp.addCookie(c); } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter printWriter = resp.getWriter(); Cookie[] cookies = req.getCookies(); if (cookies != null) { for (Cookie a : cookies){ // 输出数据 printWriter.write(a.getName()); printWriter.write(a.getValue()); } } }
-
JSP基础
1. 概念:
* Java Server Pages: java服务器端页面
* 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
* 用于简化书写!!!
2、 JSP的脚本:JSP定义Java代码的方式
1. <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
4. JSP的内置对象:
* 在jsp页面中不需要获取和创建,可以直接使用的对象
* jsp一共有9个内置对象。
* 今天学习3个:
* request
* response
* out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
* response.getWriter()和out.write()的区别:
* 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
* response.getWriter()数据输出永远在out.write()之前
Session
-
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。使用依赖于HttpSession,session基于cookie生存
-
方法
-
1. 获取HttpSession对象: HttpSession session = request.getSession(); 2. 使用HttpSession对象: Object getAttribute(String name) void setAttribute(String name, Object value) void removeAttribute(String name)
-
-
细节
-
session的钝化: * 在服务器正常关闭之前,将session对象系列化到硬盘上 * session的活化: * 在服务器启动后,将session文件转化为内存中的session对象即可。 session什么时候被销毁? 1. 服务器关闭 2. session对象调用invalidate() 。 3. session默认失效时间 30分钟 选择性配置修改 <session-config> <session-timeout>30</session-timeout> </session-config> session的特点 1. session用于存储一次会话的多次请求的数据,存在服务器端 2. session可以存储任意类型,任意大小的数据 session与Cookie的区别 1. session存储数据在服务器端,Cookie在客户端 2. session没有数据大小限制,Cookie有 3. session数据安全,Cookie相对于不安全
-
Filter过滤器
-
web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
-
过滤器的作用:
-
一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…
-
步骤
-
1. 定义一个类,实现接口Filter 2. 复写方法 3. 配置拦截路径 1. web.xml 2. 注解
-
-
案例
-
@WebFilter("/*") public class FilterDemo implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("我是过滤器"); // 放行 filterChain.doFilter(servletRequest,servletResponse); } }
-
-
细节
-
过滤器细节: 1. web.xml配置 <filter> <filter-name>demo1</filter-name> <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>demo1</filter-name> <!-- 拦截路径 --> <url-pattern>/*</url-pattern> </filter-mapping> 2. 过滤器执行流程 1. 执行过滤器 2. 执行放行后的资源 3. 回来执行过滤器放行代码下边的代码 3. 过滤器生命周期方法 1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源 2. doFilter:每一次请求被拦截资源时,会执行。执行多次 3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源 4. 过滤器配置详解 * 拦截路径配置: 1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行 2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行 3. 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行 4. 拦截所有资源:/* 访问所有资源时,过滤器都会被执行 * 拦截方式配置:资源被访问的方式 * 注解配置: * 设置dispatcherTypes属性 1. REQUEST:默认值。浏览器直接请求资源 2. FORWARD:转发访问资源 3. INCLUDE:包含访问资源 4. ERROR:错误跳转资源 5. ASYNC:异步访问资源 * web.xml配置 * 设置<dispatcher></dispatcher>标签即可 5. 过滤器链(配置多个过滤器) * 执行顺序:如果有两个过滤器:过滤器1和过滤器2 1. 过滤器1 2. 过滤器2 3. 资源执行 4. 过滤器2 5. 过滤器1 * 过滤器先后顺序问题: 1. 注解配置:按照类名的字符串比较规则比较,值小的先执行 * 如: AFilter 和 BFilter,AFilter就先执行了。 2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行
-
增强对象的功能
代理模式
概念:
1. 真实对象:被代理的对象
2. 代理对象:
3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
* 实现方式:
1. 静态代理:有一个类文件描述代理模式
2. 动态代理:在内存中形成代理类
* 实现步骤:
1. 代理对象和真实对象实现相同的接口
2. 代理对象 = Proxy.newProxyInstance();
3. 使用代理对象调用方法。
4. 增强方法
* 增强方式:
1. 增强参数列表
2. 增强返回值类型
3. 增强方法体执行逻辑
Listener:监听器
* 概念:web的三大组件之一。
* 事件监听机制
* 事件 :一件事情
* 事件源 :事件发生的地方
* 监听器 :一个对象
* 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码
* ServletContextListener:监听ServletContext对象的创建和销毁
* 方法:
* void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
* void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
* 步骤:
1. 定义一个类,实现ServletContextListener接口
2. 复写方法
3. 配置
1. web.xml
<listener>
<listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
</listener>
* 指定初始化参数<context-param>
2. 注解:
* @WebListener
Redis
-
安装
-
下载jedis的jar包 导入包 //1. 获取连接 Jedis jedis = new Jedis("localhost",6379); //2. 操作 jedis.set("username","zhangsan"); //3. 关闭连接 jedis.close();
-
-
方法
-
redis 全局方法 // 删除一个key jedis.del(key) // 设置登录密码 jedis.auth(password) // 关闭连接 jedis.close(); string 类型 // 设置单个 jedis.set("name","大帅哥"); //设置多个键值对 jedis.mset("name1","liuling","age","23","qq","476777XXX"); // 设置过期时间 jedis.setex("name1",10,"hah"); // 获取 String name = jedis.get("name"); 哈希类型 hash 对应map格式 // 设置 hset(key,filed1,value1) // 获取key 下面的 field hget(key,filed1) // 获取key hgetAll(key) 列表类型 list :linkedlist格式。支持重复元素 // 从左设置 从右获取 lpush / rpush // 从右设置 从左获取 lpop / rpop // 范围获取 lrange start end set 集合类型 不允许重复元素 无序集合 //设置 sadd(key,value,value1) //获取所有元素 smembers(key): 有序集合 // 设置 zadd(key,num,value) zrange(key,start end)
-
json
-
ObjectMapper mapper = new ObjectMapper(); province_json = mapper.writeValueAsString(list); 新建一个接口的流程 新建数据库实体类 DAO层操作数据库 Service层调用DAO实现业务操作逻辑 Servlet调用Service层方法响应数据
Maven
- Maven 的一个核心特性就是依赖管理
- 统一管理项目jar包。资源及配置的整合
- 编译打包
- 单元测试
执行流程
- maven 将项目构建的过程进行标准化,每个阶段使用一个命令完成具体执行过程为L:
- 清理----编译----测试----报告----打包------部署
安装
- 下载安装包解压
- 配置环境变量后输入 mvn -v可以查看版本
仓库管理
- 默认本地仓库位置在 u s e r . d i r / . m 2 / r e p o s i t o r y , {user.dir}/.m2/repository, user.dir/.m2/repository,{user.dir}表示 windows 用户目录。
- 远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。
远程仓库可以在互联网内也可以在局域网内。 - 中央仓库 :在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。
目录结构
-
src/main/java —— 存放项目的.java 文件 src/main/resources —— 存放项目资源文件,如 spring, hibernate 配置文件 src/test/java —— 存放所有单元测试.java 文件,如 JUnit 测试类 src/test/resources —— 测试资源文件 src/main/webapp------javaWeb工程的静态资源 target —— 项目输出位置,编译后的 class 文件会输出到此目录 pom.xml——maven 项目核心配置文件
常用命令
-
mvn -clean 删除已编译的编译文件(拉项目第一次时使用)
-
mvn -compile 的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target
目录下 -
mvn -test 的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target
目录下 -
mvn -package package 是 maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war包
-
mvn -install install 是 maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库。
-
指令生命周期
-
maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”, 这三套生命周期分别是: Clean Lifecycle 在进行真正的构建之前进行一些清理工作。 Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。 Site Lifecycle 生成项目报告,站点,发布站点。
-
创建测试项目
- 打开系统配置,file->settings->maven
- 配置安装路径
- 配置安装路径下的哦欸之文件路径
- 创建 file–》new–>maven–>选择项目安装模板
- 最后确定maven的配置路径是否正确