一:页面的跳转方式
超链接
javascript方式
java方式
超链接的页面跳转方式
语法:
- <a href = "路径">资源地址</a>
<a href = "index.jsp?username=admin&password=123">跳转到主页</a>
注意:
- 可以携带参数,并且可以在目的地通过request对象进行获取该参数
- 第一个参数之前使用 (?)
- 参数与参数之间使用(&)
javascript的页面跳转方式
- window.location.href="URL"
- window.navigate("URL")
- window.location.replace("URL")
注意:通过location跳转可以携带参数 后面可以通过request对象进行获取
<script>
<button onclick = "add();">跳转到index.jsp</button><script type="text/javascript">function add(){location.href = "index.jsp?result=123";}</script>
java的页面跳转方式
转发语法:
request.getRequestDispatcher("url.jsp").forward(request,response)
- 特点:
- 在服务器组件收到用户请求后。经过它的处理后有传递给了另一个组件。不修改用户的请求码。
- 这种方法比较实用,在服务器端运行,url使用相对路径,不会重新创建request和response,前后页面共享一个request,地址栏还是原来的地址,不是转发后的地址
重定向基本概念&语法:
由浏览器端进行的页面跳转
response.sendRedirect("url.jsp");
特点:
- 重定向一般是为了防止用户提交完数据后点浏览器刷新或点后退之后产生重复提交
- 与上面相反,url使用绝对路径,可以访问任何url,所以当要访问的不再同一webapp时使用比较好,会改变地址栏
- 根目录:http://localhost:8080/ 没有项目的名字
- 请求次数:2次
- 请求域中的数据会丢失,因为是2次请求
注意:
1.什么时候使用转发,什么时候使用重定向?
- 如果要保留请求域中的数据,使用转发,否则使用重定向。
- 以后访问数据库,增删改使用重定向,查询使用转发。
2.转发或重定向后续的代码是否还会运行?
- 无论转发或重定向后续的代码都会执行
重定向和转发的区别
- 转发比重定向快
- 使用重定向可以避免用户重新加载页面时执行相同的动作重定向无法传值,这是比较头疼的一件事,jsp的话只能在session传值或地址栏传值,SpringMvc就解决了这一问题,百度Flash属性
二:JDBC交互
JDBC介绍
SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC。这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库。
JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组成。
组成JDBC的2个包:
java.sql
javax.sql
开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实现(即数据库驱动)。
数据库驱动
安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道,让他去运行操作
DriverManager类
Jdbc程序中的DriverManager用于加载驱动,并创建与数据库的链接,这个API的常用方法:
DriverManager.registerDriver(new Driver())
DriverManager.getConnection(url, user, password),
注意:在实际开发中并不推荐采用registerDriver方法注册驱动。原因有二:
1、查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象。
2、程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。推荐方式:Class.forName("com.mysql.jdbc.Driver");
采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。
Connection类
- Jdbc程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,这个对象的常用方法:
- createStatement():创建向数据库发送sql的statement对象。
- prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
- prepareCall(sql):创建执行存储过程的callableStatement对象。
- setAutoCommit(boolean autoCommit):设置事务是否自动提交。
- commit() :在链接上提交事务。
- rollback() :在此链接上回滚事务。
Statement类
- Jdbc程序中的Statement对象用于向数据库发送SQL语句, Statement对象常用方法:
- executeQuery(String sql) :用于向数据发送查询语句。
- executeUpdate(String sql):用于向数据库发送insert、update或delete语句
- execute(String sql):用于向数据库发送任意sql语句
- addBatch(String sql) :把多条sql语句放到一个批处理中。
- executeBatch():向数据库发送一批sql语句执行。
ResultSet类
Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
- ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
- 获取任意类型的数据:
- getObject(int index)
- getObject(string columnName)
- 获取指定类型的数据:
- getString(int index)
- getString(String columnName)
三:java通过jdbc连接Oracle数据库进行交互的步骤
1、加载JDBC驱动
Class.forName(JDBC驱动类);
2、与数据库建立连接
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","admin");
3、发送SQL语句,并得到返回结果
4、处理返回结果
5、释放资源
案例:演示jdbc操作步骤
?
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%/* 作用:登录页面提交后的处理数据的页面 *///1.设置编码request.setCharacterEncoding("utf-8");//2.获取数据String username = request.getParameter("username");String password = request.getParameter("password");//3.进行Oracle数据库交互//定义两个变量存储用户名以及密码String uname = "";String pwd = "";//连接对象定义Connection conn = null;PreparedStatement ps = null;//执行对象//结果集对象ResultSet rs = null;try{//a.加载驱动//快捷方式 倒入驱动路径 OracleDriverClass.forName("oracle.jdbc.driver.OracleDriver");//b.建立连接String url = "jdbc:oracle:thin:@localhost:1521:orcl";conn = DriverManager.getConnection(url, "scott", "123");//c.编写sql语句传入执行方法返回执行对象String sql = "select * from tb_users where username = ? and password = ?";ps = conn.prepareStatement(sql);//d.占位符赋值ps.setString(1, username);ps.setString(2, password);//e.返回结果集对象rs = ps.executeQuery();//d.遍历或者判断if(rs.next()){//如果结果集中存在下一条数据//有用户返回出来了 用变量接收uname = rs.getString(2);pwd = rs.getString(3);}}catch(Exception e){e.printStackTrace();}finally{if(conn!=null&&!conn.isClosed()){conn.close();}if(ps!=null){ps.close();}if(rs!=null){rs.close();}}//4.页面跳转out.println(uname+" "+pwd);//数据交互后,如何判断进行页面跳转//只要判断uname和pwd中是否存在值 如果存在 说明登录成功 跳转到主页面//如果没有值 返回登录页面继续登录即可。 if(uname!="" && pwd!=""){//使用转发的技术跳转到主页面 主页面显示当前登录的账号request.getRequestDispatcher("home.jsp").forward(request, response);}else{out.println("<script>alert('账号或密码错误');location.href='login.jsp';</script>");}%>?