1jdbc的连接
使用的是mysql的数据库版本,mysql5.7的版本。mysql的显示软件使用的是sqlyong。
使用jdbc连接,在idea中创建·一个jbdc的类。
(1)加载驱动使用class.forName方法
(2)连接数据库,是用connection
(3)创建命令执行对象
(4)执行sql语句
(5)释放资源
具体代码如下:
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class Jdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 连接数据库
String URL = "jdbc:mysql://localhost:3306/xuexi";
String UESNAME="root";
String UESPWD="123456";
Connection conn = DriverManager.getConnection(URL, UESNAME, UESPWD);
// 创建执行命令对象
Statement stmt = conn.createStatement();
String sql = "select * from student2";
// 执行命令
ResultSet rs = stmt.executeQuery(sql);
List<student> list = new ArrayList<>();
while (rs.next()){
String stu_id = rs.getString("stu_id");
String stu_name =rs.getString("stu_name");
String stu_sex = rs.getString("stu_sex");
String stu_score = rs.getString("stu_score");
String stu_addr = rs.getString("stu_addr");
String stu_class = rs.getString("stu_class");
String stu_beizhu = rs.getString("stu_beizhu");
String stu_major1 = rs.getString("stu_major1");
String stu_age = rs.getString("stu_age");
student stu = new student(stu_id, stu_name, stu_sex, stu_score, stu_addr, stu_class, stu_beizhu, stu_major1, stu_age);
list.add(stu);
}
// 释放资源
if (stmt!=null){
stmt.close();
stmt = null;
} if (conn!=null){
conn.close();
conn = null;
}
String A =list.get(0).getStu_addr();
System.out.println(A);
}
}
注意导包要java.util的包。和jarbao,mysql-connector-java-5.1.7-bin.jar
2封装jdbc和重写方法对数据库的操作
创建一个实体类对象,这里我以student为例:
public class student {
private String stu_id;
private String stu_name;
private String stu_sex;
private String stu_score;
private String stu_addr;
private String stu_class;
private String stu_beizhu;
private String stu_major1;
private String stu_age;
并给上相关的set和get方法,还有构造器。
接下来重写jdbc:
package BaseDAO;
import bean.Student;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class Base<e> {
private static String class1 = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/xuexi";
private static String username = "root";
private static String userpwd = "123456";
private static Connection conn = null;
private static Statement stmt = null;
protected static ResultSet rs = null;
public Base() {
}
public void lianjie() throws SQLException {
conn = DriverManager.getConnection(url, username, userpwd);
System.out.println("====连接成功====");
}
public void chuangjian() throws SQLException {
stmt = conn.createStatement();
System.out.println("====创捷成功====");
}
public void addStudent(Student stu) throws SQLException {
this.lianjie();
this.chuangjian();
String stu_id = stu.getStu_id();
System.out.println("stu_id" + stu_id);
String stu_name = stu.getStu_name();
String stu_sex = stu.getStu_sex();
String stu_score = stu.getStu_score();
String stu_addr = stu.getStu_addr();
String stu_class = stu.getStu_class();
String stu_beizhu = stu.getStu_beizhu();
String stu_major1 = stu.getStu_major1();
String stu_age = stu.getStu_age();
String sql = "insert into student2 values (stu_id, stu_name, stu_sex, stu_score, stu_addr, stu_class, stu_beizhu, stu_major1,stu_age)";
stmt.executeUpdate(sql);
System.out.println("=====sql====" + sql);
this.qingchu();
}
public void zhixing(String sql) throws SQLException {
this.lianjie();
this.chuangjian();
stmt.executeUpdate(sql);
System.out.println("=====sql====" + sql);
this.qingchu();
}
public List<e> chaxun(String sql) throws SQLException {
this.lianjie();
this.chuangjian();
rs = stmt.executeQuery(sql);
List<e> list = new ArrayList();
this.yunxing(list);
this.qingchu();
System.out.println("======查询我完毕=====");
return list;
}
public void qingchu() {
if (rs != null) {
try {
rs.close();
} catch (SQLException var4) {
throw new RuntimeException(var4);
}
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException var3) {
throw new RuntimeException(var3);
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException var2) {
throw new RuntimeException(var2);
}
conn = null;
}
}
public void yunxing(List<e> list) throws SQLException {
}
static {
try {
Class.forName(class1);
} catch (ClassNotFoundException var1) {
throw new RuntimeException(var1);
}
}
}
注意这里用到了泛型studentdao<e>,这里的e根据实际传人的类可以改变,类与类之间的不同可以用子类重写父类的方式来实现。例如上述代码中的yunxing方法可以通过子类的方法进行重写。
创建已经studebntdao 继承base。
代码如下:
package BaseDAO;
import bean.Student;
import java.sql.SQLException;
import java.util.List;
public class StudentDAO extends Base<Student> {
public StudentDAO() {
}
public List<Student> fandall() throws SQLException {
String sql = "SELECT * FROM student2";
return super.chaxun(sql);
}
public List<Student> fandalltiaojian(String sql) throws SQLException {
return super.chaxun(sql);
}
public void yunxing(List<Student> list) {
while(true) {
try {
if (rs.next()) {
String stu_id = rs.getString("stu_id");
String stu_name = rs.getString("stu_name");
String stu_sex = rs.getString("stu_sex");
String stu_score = rs.getString("stu_score");
String stu_addr = rs.getString("stu_addr");
String stu_class = rs.getString("stu_class");
String stu_beizhu = rs.getString("stu_beizhu");
String stu_major1 = rs.getString("stu_major1");
String stu_age = rs.getString("stu_age");
Student stu = new Student(stu_id, stu_name, stu_sex, stu_score, stu_addr, stu_class, stu_beizhu, stu_major1, stu_age);
list.add(stu);
continue;
}
} catch (SQLException var12) {
var12.printStackTrace();
}
return;
}
}
}
这里继承的时候就要给确定的类如上面的Base(student)。
3写代码的三层架构
前面的jdbc的base和jdbc,studentdao都是属于dao层:数据持久层;
在service中进行具体操作的代码:如增删改查等,在servic中创建基本实现类,调用dao的方法进行实现。
在控制层进行前后端的数据交互和处理;
4servlet
1什么事servlet:
是一组抽象类接口--接受请求和响应的接口。
实现其中所有的抽象方法。
是一个运行在web服务器中的小程序,通过http协议
接受和响应来自web客户端的请求。
要实现我们的接口,我们需要让类继承GenericServlet
或者是HttpServlet
动态的产生jsp页面需要的值。
2怎么使用:
请求方式get-----站在楼上喊-》不具备保密性;数据传送有限制---256个字节。
post---发短信买饭-》具备信息的安全性;数据转送无限制--理论上无限制。
创建一个类并且继承HttpServlet
<form action="servlet的名称p-add.do" method="post/get">
<input type="text" name="stu_id"/>谁是世界上最帅的男人?
<input type="submit" value="提交"/>
</form>
配置web.xml文件--作用:处理谁找谁的问题?
配置servlet
<serlvet>
<serlvet-name>AddServlet</servlet-name>
<servlet-class>com.it.servlet.AddServlet</servlet-class>
</servlet>
配置servlet映射
<servlet-mapping>
<servlet-name>AddServlet</servlet-name>
<url-patter>/add.do</url-patter>
</servlet-mapping>
servlet解析请求中携带的问题和问题的类型(get/post)
doGet(){
业务逻辑
};
doPost(){
业务逻辑
};---继承了HttpServlet----doget;dopost---继承中的重写;
注意:add.do==add.jsp==add.hmtl===类似于中转站的功能。
3添加功能
add.jsp发送post类型的请求到add.do中
web.xml文件通过servlet配置和url映射找到add.do
post方法通过getParamter();从用户请求中解析出有价值的数据
封装数据,调用dao,完成添加。
4显示功能
add.jsp发送post类型的请求到show.do中
web.xml文件通过servlet配置和url映射找到show.do
查询方法得到集合
集合写到页面中显示给用户
response.setContentType("text/html;charset='utf-8'");
out.print("<td>"+list.get(i).getId()+"</td>")
out.
5servlet的生命周期
servlet中的方法(构造器,destory(),doget(),dopost(),init(),service(2个方法(一个是继承了Http,一个是没有继承Http协议的(自身),)));
调用init();---------构造器,intit
servlet容器装载servlet的时机:什么时候创建servlet
a、默认情况:当用户第一次发起请求的时候,servlet容器装载servlet
b、服务启动是,自动装载情况,
在配置文件servlet中<load-on-startup>1</load-on-startup>
c、Servlet类文件被更新后,重新装载Servlet
--------装载----servlet容器创建servlet实例-----调用init()初始化
特征:在servlet的生命周期中只加载一次
阶段2:响应客户请求阶段】
------service,doget,dopost
当用户发起请求的时候,servlet容器会创建这个请求所特定的HttpServletRequset
和HttpServletResponse,交给service,解析HttpServletRequset中所携带的请求,
识别出我们的请求类型(基于http的get方法doGet(),基于http协议的post方法doPost()
----走对应的方法中的逻辑业务。
---->请求是数据包实质是:HashTable(线程安全)<--------->HashMap(线程不安全);
HashTable<String,String> hsh=HashTable<String,Sring>();
<select>
<option value="1">上海</option>
</select>
【阶段3:终止阶段---销毁servlet】
a、当WEB应用被终止
b、Servlet容器终止运行
c、Servlet容器重新装载Servlet新实例时
---------Servlet容器会先调用Servlet的destroy()方法,
在destroy()方法中可以释放掉Servlet所占用的资源。
5jsp
jsp的本质:Servlet 这个个体你的功能是view层。
jsp:模板引擎
1什么是jsp
从之前的程序可以看出,在serlvet的控制层中存在大量的视图层代码,这不符合MVC设计原则,不利于维护等。
为此将控制层中的关的视图层的代码全部抽取出来,形成了jsp页面。
总结:JSP诞生于servlet,本质就是servlet。
JSP:java Server Page 一种服务器端变成技术之一,用于创建动态网页。
JSP的运行原理:
浏览器不能直接解析JSP,因为JSP本质是servlet,是java。
JSP被JSP编译器编译成java Servlets,然后再由java编译器来编译成机器码,也可以直接编译成二进制。
JSP主要内容:脚本,指令,动作。
JSP生命周期:转换,编译,执行。
2JSP脚本
表达式:对数据的表示,系统将其作为一个值进行计算和显示。
<%= java表达式 %>
<b>100,99中最大的值 :</b><%=Math.max(100,99) %><br/>
JSP Scriptlet:就是在JSP页面中嵌入的一段java代码。
<% java代码 %>
循环输出
JSP声明:在jsp页面中声明java方法或变量等。
<%! java代码 %>
page 指令属性:language,import,isErrorPage,errorPage,buffer(设置用来存储客户端请求的缓冲区的大小。)
例子:<%@ page language = "Java" import "java.util.*" buffer = "8kb" errorPage="error.jsp" isErrorPage="false"%>
errorPage:当前页面出现异常的时候跳转到那个页面进行处理
isErrorPage:指定当前页面是否可以作为另一个JSP页面的错误处理页面
3jsp指令
include:指令用于在jsp页面中静态包含一个文件,该文件可以是jsp页面,HTML页面,文本文件。
使用了include指令的jsp页面在转换时,jsp容器会在其中插入所包含文件的文本或者代码。
语法: <%@ include file = ”” %>
例子:<%@ include file = "/test.html" %>//注意相对路径
<%@page language="java"%>
<%@include file="head.jsp"%>
Taglib:指令可以让JSP页面使用标签,将标签库描述符文件引入到该页面中,并设置前缀,而去
利用标签的前缀去使用标签库表述文件中的标签。
语法:<%@ taglib uri = ”标签库表述符文件” prefix = ”前缀名” %>
4jsp动作
jsp:include动作标记:用来在JSP页面中动态包含一个文件,包含页面程序与被包含页面程序是彼此独立的,
互不影响。
使用格式:<jsp:include page="文件的url" />
或者:<jsp:include page="文件的url">
<jsp:param 子标记/>
</jsp:include>
比较:jsp:include动作标记与include指令标记的区别
a、包含文件的处理时间和方式不同
include指令标记插入的文件在页面转译时就合并到一起了。
而jsp:include指令标记插入的文件,
在当前页面执行时再将被包含文件插入。---一个是独立的,一个非独立。
在页面中所有的结果都是以无状态的字符串形式存在。
b、include:被包含文件与当前页面组合而成的新页面必须
符合JSP的语法和逻辑规则,由于是提前合并编译;
而jsp:include动作标记被包含的文件语法和逻辑独立于当前页面,
单独被JSP引擎编译。
c、Include执行快;jsp:include慢,
但可以利用param子标记传递参数,使用更灵活。
语法格式:<jsp:param name=“参数名字” value=“指定的参数值“ />
注意点:name是参数名字、value是参数的值
当该标记作为jsp:include的子标记时
“name—value”为页面之间提供参数传递。
5解释转发和重定向的区别
转发:请求不管经历了多少个页面或者类,请求本身不发生变化。
重定向:请求发生了变化
6jsp:forward动作
允许将用户请求定位到其它页面
语法:<jsp:forward page={"要转向的页面url"|"<%=表达式%>"} />
或者:<jsp:forward page={"要转向的页面url"|"<%=表达式%>"} >
<jsp:param name="属性名" value="属性值" />
</jsp:forward>
6jsp的内置对象
pageContext:当前页面设置,只能在当前页取
request: 用于两具有转发行为的对象数据交互 悄悄话
session: 整个工程都能获取值,会话关闭—浏览器关闭,数据丢失
application: 整个工程都能获取值,服务器关闭或重启数据丢失。
四大作用域对象 能够实现数据的交互 前后端的数据交互
out confi exeption page respon
6jstl+el表达式
mvc1中的控制层和视图层不明确。
jsp中的java代码太多。
mvc2:jsp页面中尽量不适用java代码。
------我们要使用一个新的东西(前端代码)---替代java代码
功能不能改变。
1el中对象
getParameter("name");------>${param.name}
特殊情况:param.a.c---》${param["a.c"]}
pageContext.getAttribute("name")---${pageScope.name};
特殊情况:param.a.c---》${param["a.c"]}
request.getAttribute("name")----${requestScope.name}
session.getAttribute("name")----${sessionScope.name};
application.getAttribute("name")---${applicationSope.name}
7jstl标签库
、使用指令元素引入
<%@taglib var="" uri="" %>
标签库引入方式:---导包:jstl.jar;standar.jar;
c: http://java.sun.com/jsp/jstl/core
fmt:http://java.sun.com/jsp/jstl/fmt
sql:http://java.sun.com/jsp/jstl/sql
xml:http://java.sun.com/jsp/jstl/xml
fn: http://java.sun.com/jsp/jstl/functions
c:核心标签库---输入,输出,控制语句,导入,导出,重定向
1、循环:<c:forEach items="" 集合 begin="1"开始 step="2"整数,自增方式,end="9" varStatus="v"></c:forEach>
v对象:
index:下标
count:次数
first:判断是否为第一
last:判断是否为最后
2、if判断:<c:if test="${param.n>60}" 条件表达式 var="b" scope="p/r/s/a">
${b}及格
</c:if>
if(flag==1){
登陆成功
}
else{
登陆失败
}
scope对象(固定四个值):
page
reuqest
session
application
3、设置属性:<c:set var="s" 属性名称 value="中国" scope="" 属性范围 ></c:set>
${s1}
其他属性
target="" 给目标属性赋值
java中的表示方法:
Person p=new Person();
p.setId(1);
p.setName("admin");
request.setAttribute("p",p);
Person p1=(Person)request.getAttribute("p");
out.println(p1.getId());
out.println(p1.getName());
jstl声明对象:
<jsp:useBean id="s" class="com.it.bean.Student" scope="request"></jsp:useBean>
<jsp:setProperty property="name" name="s" value="admin"></jsp:setProperty>
<jsp:getProperty property="name" name="s"></jsp:getProperty>
${requestScope.s.name}
<c:set target="${p}" property="id" value="2"></c:set>
4、输出标记:<c:out value="<font color="red">中国</font>" escapeXml="false" 特殊字符转移></c:out>
4、多条件判断:
<c:choose>
<c:when test="${param.n>90}">
成绩优秀
</c:when>
<c:when test="${param.n>80}">
成绩中等
</c:when>
<c:other>
成绩不及格
</c:other>
</c:choose>
5、指定字符串转换成数组
id name sex age hobby
桌球-象棋-敲代码-看小说
<c:forTokens items="中国,你好,再见" delims="," var="v" >
${v}
</c:forTokens>
6、删除变量值
定义变量:<c:set var="salary" scope="session" value="200"></c:set>
删除前:<c:out value="${salary}"></c:out>
<c:remove var="salary"></c:remove>
删除后:<c:out value="${salary}"></c:out>
core----forEach,if,choose,when,otherwise,set,out,
jsp:userBean,setProperty,getProperty,remove
fmt:格式化标签库:
日期格式:
<fmt:formatDate value="${isoDate}" type="both">
<fmt:formatDate value="${date}" type="date">
<fmt:formatDate value="${isoDate}" type="time">
<fmt:formatDate value="${isoDate}" type="date" dateStyle="default">
<fmt:formatDate value="${isoDate}" type="date" dateStyle="short">
<fmt:formatDate value="${isoDate}" type="date" dateStyle="medium">
<fmt:formatDate value="${isoDate}" type="date" dateStyle="long">
<fmt:formatDate value="${isoDate}" type="date" dateStyle="full">
<fmt:formatDate value="${isoDate}" type="time" timeStyle="default">
<fmt:formatDate value="${isoDate}" type="both" pattern="EEEE,MMMM d, yyyy HH:mm:ss Z'">
<fmt:formatDate value="${isoDate}" type="both" pattern="d,MMMM yy, h:m:s a zzzz">
fn:函数标签----length,截取子字符串
${fn:subString("hellword",5,9)}-----函数标签放在el表达式中使用。
${fn:length(st)}
xml:xml标签-----xml解析
sql:sql标签库----对sql语句进行操作
配置数据源:<sql:setDataSource
driver=“com.microsoft.jdbc.sqlserver.SQLServerDriver”
url=“jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=”
user=“sa” password=“123”/>
查询语句:
<sql:query sql=“select * from test” var=“result” />
<c:forEach items=“${result.rows}” var=“row”>
${row.id}
${row.name}
</c:forEach>
好了今天的分享就到这里,下次正式介绍前后段的交互,利用servlet和jsp。