环境配置
陆陆续续,有很多的博客已经很详细了,在这里我就不赘述了。
JSP页面元素
<%
局部变量,java语句
%>
<%!
%>
<%=输出表达式%>
page指令:
<%@ page language=“java”–>jsp页面所使用的语言
import–>导入包
contentType=“text/html; charset=UTF-8”–>浏览器解析jsp的编码
pageEncoding=“UTF-8”%–>jsp文件自身编码 jsp–>java>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.Date"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
public String bookName;//全局变量
public void init(){
Date date=new Date();
bookName="java书"+date ;
}
%>
<%
String name="Zhangsan";
out.print("<font color=red>hello</font>"+name+"<br/>");
init();
%>
<%="he<br/>llo"+bookName%>
</body>
</html>
注释
- html
<!-- -->
- java
// /*....*/
- jsp
<%-- --%>
JSP九大内置对象(不需要new 也能使用的对象)
Person per=new Person()
名称 | 功能 | 对象常用方法 |
---|---|---|
out | 输出对象,向客户端输出内容 | |
request | 请求对象:存储“客户端向服务端发送的请求信息” | String getParameter(String name): 根据请求的字段名key,返回值value/String getParameterValues(String name): 根据请求的字段名key,返回多个字段值setCharacterEncoding (“编码格式utf-8”):设置请求编码getRequestDisPatcher().forward(): 请求转发A–>B |
respose | 响应对象 | void addCookie(Cookie cookie): 服务端向客户端增加cookie对象 void sendRedirect(String location) throws IOException: 页面跳转的一种方式/void setContetType(String type) :设置服务端响应的编码(设置服务端的contentType类型) |
cookie(客户端,不是内置对象 ) | Cookie是由服务端产生,再发送给客户端保存,即本地缓存 ,可以提高访问服务端的效率,但是安全性较差 | Cookie:key=value javax.servlet.http.Cookie public(String key,String value) String getName() String getValue() 最大有效期: void setMaxAge(int expiry) 服务端准备cookie: response.addCookie(Cookie cookie) 页面跳转(转发,重定向) 客户端获取cookie:request.getCookies(); 注意:服务端增加cookie:response对象,客户端获取对象:request对象,b.不能只获取一个单独的对象,全部的对象都需要获取 |
session(服务端) | 会话:a.浏览网站:开始–关闭b.购物:浏览,付款,退出c.邮件:浏览,写邮件,退出–>开始–结束 | |
application | 全局对象 | String getContextPath: 虚拟路径 ` |
`绝对路径
get/post 提交方式:
- method=“get”、地址栏、超链接(a href=“XX”) 请求方式 默认都属于get提交方式
- get和post请求方式的区别
- get方式 在地址栏显示请求信息(但是地址栏能顾容纳的信息有限,如果有图片,视频等大文件则容量可能出现不足),post不会显示
- 文件上传操作,必须是post
总结:推荐使用post
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="show.jsp" method="post">
用户名:<input type="text" name="uname"/><br/>
密码:<input type="password" name="upwd"/><br/>
年龄:<input type="text" name="uage"/><br/>
爱好:<br/>
<input type="checkbox" name="uhobbies" value="足球"/>足球
<input type="checkbox" name="uhobbies" value="篮球"/>篮球
<input type="checkbox" name="uhobbies" value="乒乓球"/>乒乓球
<br/>
<input type="submit" value="注册">
</form>
</body>
</html>
show.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 获取元素 -->
<%
//设置编码
request.setCharacterEncoding("utf-8");
String name=request.getParameter("uname");
int age=Integer.parseInt(request.getParameter("uage"));
String pwd=request.getParameter("upwd");
String[] hobbies=request.getParameterValues("uhobbies");
%>
注册成功:信息如下:<br/>
姓名:<%=name %>
年龄:<%=age %>
密码:<%=pwd %>
<br/>
爱好:
<%
if(hobbies !=null){
for(String hobby:hobbies){
out.print(hobby+" ");
}
}
%>
</body>
</html>
统一请求的编码:request
get:
- 统一每一个变量的编码 new String(旧编码,新编码)name=new String(name.getbytes(“iso-8859-1”),“utf-8”)
- 修改 server.xml URIEncoding=“UTF-8”
建议使用tomcat时,首先在server.xml 中 统一get方式的编码 URIEncoding=“UTF-8”
post:
- reques.setCharacterEncoding(“utf-8”)
请求转发以及重定向的区别
重定向 | 请求转发 | |
---|---|---|
地址栏是否改变 | 改变 | 不变 |
是否保留第一次请求的数据 | 不保存 | 保存 |
请求次数 | 2 | 1 |
内部操作 | 张三(客户端)–>服务端窗口(A)(服务端)–>去找B–>张三(客户端)–>服务端窗口(B)(服务端)–>结束 | 张三(客户端)–>服务端窗口(A)(服务端)–>服务窗口B |
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="check.jsp" method="post">
用户名:<input type="text" name="uname"><br/>
用户名:<input type="password" name="upwd"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
check.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String name=request.getParameter("uname");
String pwd=request.getParameter("upwd");
if(name.equals("zs")&&pwd.equals("abc")){
//response.sendRedirect("success.jsp");由于页面跳转而导致的页面数据丢失,重定向
request.getRequestDispatcher("success.jsp").forward(request,response);
}else{
//登录失败
out.print("用户名或者密码有误");
}
%>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
登录成功!<br/>
欢迎您:
<%
String name=request.getParameter("uname");
out.print(name);
%>
</body>
</html>
使用cookie进行记住密码的操作
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
String uname;
%>
<%
Cookie[] cookies=request.getCookies();
for(Cookie cookie:cookies){
if(cookie.getName().equals("uname")){
uname=cookie.getValue();
}
}
%>
<form action="check.jsp" method="post">
用户名:<input type="text" name="uname" value="<%=(uname==null?"":uname)%>"><br/>
密码:<input type="password" name="upwd"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
check.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String name=request.getParameter("uname");
String pwd=request.getParameter("upwd");
//将用户名加入到cookie到当中
Cookie cookie=new Cookie("name",name);
response.addCookie(cookie);
response.sendRedirect("result.jsp");
%>
</body>
</html>
result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
session
- seesion存在于服务端
- session是在同一个用户(客户)请求共享
- 实现机制:第一次客户请求时 产生一个sessionID 并复制给 cookie的sessionID 然后发给客户端 最终 通过session的sessionID–>cookie的sessionID
session机制
客户端第一次请求服务端时,服务端会产生一个session对象(用于保存该客户的信息);
并且每个sesson对象都会有唯一的sessionID(用于区分其他session);
服务端又会产生一个cookie,并且该cookie的name=JESSIONID,value=服务端sessionID的值;
然后服务端会在响应客户端的同时,将该cookie发送给客户端,至此,客户端就有了一个cookie(JESSIONID)
因此,客户端的cookie就可以和服务端的session一一对应(JESSIONID–sessionID)
客户端第二次/第n次请求服务端的时候,服务端会先用客户端cookie中的JESSIONID 去服务端的session中匹配的sessionid,如果匹配成功(cookie jsessionID和sessionID)
session方法
- getID():获取sessionID
- boolean isNew():判断是否是新用户(第一次访问)
- void invalidate():使sessionID失效(退出登录、注销)
- getAttribute():
- getAttribute():
- void setMaxInactiveInternal(秒):设置最大有效(非活动时间)
- int getMaxInactiveInternal:获取最大有效(非活动时间)
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="check.jsp" method="post">
用户名:<input type="text" name="uname"><br/>
密码:<input type="password" name="upwd"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="check.jsp" method="post">
用户名:<input type="text" name="uname"><br/>
密码:<input type="password" name="upwd"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
check.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String name=request.getParameter("uname");
String pwd=request.getParameter("upwd");
if(name.equals("zs")&&pwd.equals("abc")){
//只有登录成功--session才能有uname和pwd
session.setAttribute("uname", name);
session.setAttribute("upwd", pwd);
System.out.println("sessionID"+session.getId());
//登录成功,转发或者重定向
//session.setMaxInactiveInterval(10);
request.getRequestDispatcher("welcome.jsp").forward(request,response);
}else{
//登录失败--重新登录
response.sendRedirect("login.jsp");
}
%>
</body>
</html>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
欢迎您:
<%
String name=(String)session.getAttribute("uname");
//如果用户没有注册,而是直接登录,则必然是:用户名:null
if(name!=null){
out.print(name);
%>
<a href="invalidate.jsp">注销</a>
<%
}else{
response.sendRedirect("login.jsp");
}
%>
</body>
</html>
invalidate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
session.invalidate();//session失效
//失效完重定向
response.sendRedirect("login.jsp");
//session.removeAttribute("uname");
%>
</body>
</html>
JDBC
JDBC
- JDBC:Java database Connectivity:可以为多种关系数据库DBMS提供统一的访问方式
JDBC API 主要功能:
三件事:具体是通过以下类/接口来实现
DriverManager:管理jdbc驱动
Connection:连接
Statement(PreparedStatement):增删改查
CallabaleStatement:调用数据库中的存储过程/存储函数
ResultSet:结果集
- JDBC API:提供各种操作访问接口:Connection Statement PreparedStatement ResultSet
- JDBC DriverManager:管理不同的数据库驱动
- 各种数据库驱动:由相应的数据库厂商提供,作用是为了连接/直接操作数据库
jdbc访问数据库的具体操作步骤
- 导入驱动,加载具体的驱类
- 与数据库进行连接
- 发送sql;,执行
-处理结果集(查询)
使用jdbc进行数据库进行操作的时候,只需要修改:驱动,具体驱动类,连接字符串,用户名,密码
Connection Statement
import java.beans.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
public class OA{
private static final String URL = "jdbc:mysql://localhost:3306/mysql";
public static void update() {
Connection conn = null;
java.sql.Statement stmt = null;
// a.导入驱动包,加载具体的驱动类
try {
Class.forName("com.mysql.jdbc.Driver");
// b.与数据库进行连接
String url = "jdbc:mysql://localhost:3306/stt?user=root&password=&useUnicode=true&characterEncoding=utf-8";
conn = DriverManager.getConnection(url);
stmt = conn.createStatement();
String sql = "insert into sta values('17','李四','男','26')";
int count = stmt.executeUpdate(sql);
if (count > 0) {
System.out.println("发送成功");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
try {
stmt.close();// 对象.方法
conn.close();
}catch(Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
public static void query() {//查询
Connection conn = null;
java.sql.Statement stmt = null;
ResultSet rs=null;
// a.导入驱动包,加载具体的驱动类
try {
Class.forName("com.mysql.jdbc.Driver");
// b.与数据库进行连接
String url = "jdbc:mysql://localhost:3306/stt?user=root&password=&useUnicode=true&characterEncoding=utf-8";
conn = DriverManager.getConnection(url);
stmt = conn.createStatement();
// String sql = "select sno,sname from sta";
String sql="select sname from sta where sno=12";
rs = stmt.executeQuery(sql);//返回值表示增删改查几条数据
while(rs.next()) {
// int sno=rs.getInt("sno");
String sname=rs.getString("sname");
// int sno=rs.getInt(1);
// String sname=rs.getString(2);
// System.out.println(sno+"----"+sname);
System.out.println(sname);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
try {
if(rs!=null) rs.close();
stmt.close();// 对象.方法
conn.close();
}catch(Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
public static void main(String[] args) {
update();
query();
}
}
public static void getCount(){
Connection conn = null;
PreparedStatement pst=null;
int rs=0;
try {
String sql="insert into sta (sno,sname,ssex,sage) values(?,?,?,?)";
String url = "jdbc:mysql://localhost:3306/stt?user=root&password=&useUnicode=true&characterEncoding=utf-8";
conn=DriverManager.getConnection(url);
pst=(PreparedStatement) conn.prepareStatement(sql);
//pst.setString(1,tableName);
pst.setInt(1, 55);
pst.setString(2, "liquan");
pst.setString(3, "男");
pst.setInt(4, 12);
rs=pst.executeUpdate();
// System.out.println(sname);
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(pst!=null) pst.close();
pst.close();// 对象.方法
conn.close();
}catch(Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
System.out.println(rs);
}
jdbc总结(模板,八股文)
-
导入数据包,加载具体的驱动类
Class.forName("com.mysql.jdbc.Driver");
-
与数据库进行连接
conn = DriverManager.getConnection(url);
-
通过connection,获取操作数据库的对象
(statement/preparedStatement/callableStatement)
-
(查询)处理结果集
rs=ptmt.executeQuery()
try{}
catch{}
finally{
rs.close();
stmt.close();
connection.close();
}
CallableStatement(未完待续…)
- 调用 存储过程,存储函数
- connection.prepareCall(参数:存储过程或函数名)
- 参数格式:
存储过程(无返回值,用Out参数替代)
{call 存储过程名(参数列表)}
存储函数(有返回值return):
{?= call 存储函数名(参数列表)}
处理CLOB【Text】/BLOB类型
处理稍大型数据:
a.存储路径 通过JDBC存储路径,然后根据IO操作处理,获取:1.获取该路径2.IO
CLOB:大文本数据(小说–>数据)
BLOB:二进制文件
CLOB: