前后端交互(mysql,jdbc,servlet,jsp,el,servlet的内置对象)

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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值