18_3JSP学习笔记

              JSP学习笔记

1 为什么需要JSP

为什么会出现JSP?

​ —程序员在开发过程中,发现Servlet做界面非常不方便,比较麻烦,于是就有了JSP。

JSP = html + css + Javascript + java 片段 + jsp标签 (Servlet)

​ 学JSp 就是学 JSP标签

JSP是什么?

​ 1.JSP运行在服务器端

​ 2.JSP = Java Server page

​ 3.JSP的基础是servlet,相当于对Servlet进行一个包装,本质还是Servlet

​ 4.JSP是综合技术

​ 5.JSP无需配置,可以直接使用

​ 6.如果你修改了JSP文件,不用重新发布web应用

​ 7.JSP如何访问:http://ip:8080/web应用名/jsp路径 (从web开始算)

​ http://localhost:8080/jsp_servlet_project/showTime.jsp

image-20220217161337770

​ 8.JSP是一种动态网页技术

2 JSP快速入门

  1. language 表示jsp的片段语言,表示这是JSP页面

  2. 在<% %> 可以写我们的Java代码,就和我们在Java文件中写Java代码是一样的

    有多个<% %>其实相当于一个大的<% %>,在<% %>会成为service函数的局部变量

  3. 为什么可以直接使用out对象,是因为out是JSP的内置对象

    (总共有9个,每个都能找到它和Servlet的对应关系)

<%@ page import="java.util.Date" %>
<%@ page language="java" contentType="text/html;charset=UTF-8"  %>
<html>
<head>
    <title>Title</title>
     <script type="text/javascript" src="js/js1.js"></script>
</head>
<body>
     <%
         Date date = new Date();
         out.println("hello,wolrd" + "当前日期="+date);
     %>
</body>
</html>

运行结果:

请求:http://localhost:8080/jsp_servlet_project/showTime.jsp

image-20220217162651605

​ 。 JSP的全称是Java Server Pages,它和Servlet技术一样,都是sun公司定义的一种用于开发动态web资源的技术。

​ 。JSP这么技术的最大的特点就在于:写jsp就像写html,但:

​ 。它相比html而言,html只能为用户提供静态数据,而JSP技术允许在页面中嵌入Java代码,为用户提供动态数据。

​ 。相比Servlet而言,Servlet很难对数据进行排版,

​ 而JSP除了可以用Java代码产生动态数据的同时,也很容易对数据进行排版。

​ 也就是说,JSP继承了html和Servlet两者的优点

​ 。JSP最佳实践:

​ 不管JSP还是Servlet,虽然都可以用于开发动态web资源,但由于这2门技术各自的特点,

​ 在长期的软件实践中,人们逐渐把Servlet作为web应用中的控制器组件,而把JSP技术作为显示模板来使用。

​ 因此,在软件开发中,根据这两门技术的特点,让它们各自负责各的,

Servlet只负责响应请求产生的数据,并把数据通过转发技术带个jsp,

数据显示JSP来做。

3 JSP运行原理

jsp的运行原理:单实例

image-20220217165414544

image-20220217170436433

image-20220217171946386

showTime.jsp

<%@ page import="java.util.Date" %>
<%@ page language="java" contentType="text/html;charset=UTF-8"  %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%@include file="head.jsp"%>
     <%
         Date date = new Date();
         out.println("hello,wolrd" + "当前日期="+date);
     %>
</body>
</html>

翻译后:

showTime_jsp.java

package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.Date;

public final class showTime_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>Title</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("     ");

         Date date = new Date();
         out.println("hello,wolrd" + "当前日期="+date);
         int i = 9/0;
     
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

原理细节分析:

​ 。web服务器是如何调用并执行一个JSP页面的?

​ 。JSP页面中的html排版标签时如何被发送到客户端的?

image-20220217174026607

​ 。JSP页面汇总的Java代码,服务器是如何执行的?

image-20220217174101761

​ 。web服务器在调用JSP时,会给JSP提供一些什么Java对象?

4 JSP九大内置对象

4.1 out–PrintWriter

向客户端输出数据字节流

out.println("");

4.2 request–HttpServletRequest

​ 接收客户端的http请求

request.getParameter(String name);   //name表示表单的参数
request.getParameterValues(String name); //使用得到的是String[]
request.setAttribute(String name,Object obj); //设置属性
request.getAttribute(String name);  //获取属性的值
request.getCookies();   //获取cookie

4.3 response–HttpServletResponse

​ 封装JSP的产生的回应

response.addCookie(Cookie cookie);
response.sendRedirect("./welcome.jsp");

4.4 session–session

​ 用于保存用户的信息,跟踪用户的行为

session.setAttribute(String name,Object obj);  //设置属性
session.getAttribute(String name);   //获取属性

4.5 application–ServletContext

​ 多个用户共享该对象,可以做计数器

4.6 config–ServletConfig

​ 代表JSP对应的Servlet的配置,可以得到web.xml中的参数

4.7 pageContext

​ 代表JSP页面的上下文,也是一个域对象,可以setAttribute(),作用范围只是本页面

​ 只在本页面有效

4.8 page

​ 代表JSP这个实例本身(使用比较少)

4.9 exception

​ 代表运行时的一个异常

exception.getMessage();

总结:

​ pageContext(域对象,存放的数据只能在当前页面使用)

​ request(域对象,存放的数据在一次request请求有效)

​ session(域对象,存放的数据在一次会话有效)

​ application(域对象,存放的数据在整个web应用运行期间有效)

JSP内置对象和Servlet对象对应关系:

JSP内置对象Servlet对象
outJspWriter
requestHttpServletRequest
responseHttpServletResponse
sessionHttpSession
applicationServletContext
configServletConfig
pageContextpageContext
pagethis
exceptionException

5 JSP语法(标签)

5.1 指令元素

指令元素:用于从JSP发送一个信息到容器,比如设置全局变量,文字编码,引入包等

1.Page指令

//引入包
<%@ page import="java.util.Date" %>
//设置字符编码  用的语言是Java    
<%@ page language="java" contentType="text/html;charset=UTF-8"  %>

page指令常用属性:

属性含义
language=“java”jsp中嵌入的代码是什么,通常是java
import=“包.类名” <%@ page import=“java.util.Date” %>在jsp页面中引入包或者某个具体的类
//指定网页以什么方式显示页面
contentype ="text/html;charset=utf-8"
    
//指定servlet引擎以什么方式翻译jsp-->servlet并指定网页以什么方式显示页面    
pageEncoding = "utf-8"     

2.include指令

该指令用于引入一个文件(通常是JSP文件),jsp引擎会把两个jsp文件翻译成一个Servlet文件,因此也称为静态引入。

被引入的jsp文件,只需保留page指令即可,…均可省略

路径从web作为根目录

<%@ include file = "filename" %>
//比如  公共的头部
<%@ include file = "head.jsp" %>

head.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

   我是头部

showTime.jsp

<%@ page import="java.util.Date" %>
<%@ page language="java" contentType="text/html;charset=UTF-8"  %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%@include file="head.jsp"%>
     <%
         Date date = new Date();
         out.println("hello,wolrd" + "当前日期="+date);
     %>
</body>
</html>

运行结果:

http://localhost:8080/jsp_servlet_project/showTime.jsp

image-20220218100741421

3.taglib标签指令

​ 这个指令允许在jsp页面使用自定义的标签

<myTag: yourTag num1="123" >

5.2 脚本元素

​ 脚本元素:可以理解就是java的片段

  1. <% java代码 %>
<%
         Date date = new Date();
         out.println("hello,wolrd" + "当前日期="+date);
     %>
  1. 表达式 <% =java表达式 %>
<%= 5*7+2 %>

5.3 动作元素

已经用的很少了。

​ 动作元素是使用xml语法写的,是jsp规定的一系列标准动作,

​ 在容器处理jsp时,当容器遇到动作元素时,就执行响应的操作。

1.<jsp:include >

引入另外一个文件,但这是动态引入,会生成2个servlet类

<jsp:include page="info.jsp" />

和<%@ include file=" " %>静态引入的区别:

​ 相同点:把一个文件引入到另外一个文件

​ 区别:

​ 静态引入:把两个jsp翻译成一个Servlet,所以被引入的文件不要包含

​ 动态引入:把2个jsp分别翻译,所以被引入的jsp包含有也可以。

2.<jsp:forward >

作用是跳转

在开发jsp的过程中,我们通常把jsp放入WEB-INF目录,目的是为了防止用户直接访问这些jsp文件,

在webRoot下我们有一个入口页面,index.jsp,它的主要作用是转发

index.jsp

<jsp:forword file="/WEB-INF/manager.jsp" />

5.4 注释

2种注释方式

html注释方式,可以使用在jsp
<!--注释的内容 -->
    
jsp专用注释方式
<%--注释的内容 --%>

6 开发模式演变

在Java EE的开发中,有几个重要的开发模式:

​ 1.model1模式 (纯JSP,不带java类)

​ 2.model分层模式(界面、业务逻辑分离) 也称 MV模式 (JSP + Java类)

​ 3.MVC模式(model2) (JSP+Servlet+Java类)

6.1 model1模式

6.1.1 model1模式

​ model1的基础是JSP文件,它由一些相互独立的JSP文件,和其他一些Java class组成(不是必须的)。

这些JSP从HTTP Request中获得所需要的数据,处理业务逻辑,然后将结果通过response返回前端浏览器。

image-20220219184709283

model1模式的缺点:

​ 1.表现层和业务逻辑层混合在一起(乱!)

​ 2.在开发过程中,不利于多人的协同开发

​ 3.不利于后期的维护

model1的优点:

​ 1.简单,开发速度比较快

​ 2.比较适合开发小的项目

model1开发模式的反思:

​ 留心的朋友可能看到了程序设计是有不合理的地方:

​ 这种方法将界面和业务逻辑放在一起,model1模式存在一些问题:

​ 1.在loginController.jsp文件去操作数据库,类似逻辑将来会有很多,有重复的代码

​ 2.整个框架没有清晰的层次关系,显得非常乱

​ 3.代码一点也不优雅,可维护性差

6.1.2 代码实现

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
     <h1>用户登录</h1>
     <form action="LoginController.jsp" method="post">
         用户名: <input type="text" name="userId" /><br/>
         密  码: <input type="password" name="password" /><br/>
         <input type="submit" value="提交" />
     </form>
</body>
</html>

LoginController.jsp

<%@ page import="java.sql.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   <%
         String userId = (String)request.getParameter("userId");
         String password = (String)request.getParameter("password");

       //到数据库验证
       Connection connection = null;
       ResultSet rs = null;
       PreparedStatement ps = null;
       try {
           //1.加载驱动
           Class.forName("oracle.jdbc.driver.OracleDriver");

           //2.得到连接
           connection = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","admin");

           //3.创建preparedSatement
           ps = connection.prepareStatement("select * from users where id=? and password=?");
           //给?赋值
           ps.setObject(1,userId);
           ps.setObject(2,password);

           //4.执行操作
           rs = ps.executeQuery();

           //5.拿到结果集
           if(rs.next()){
               //进来,说明该用户合法
               //跳转到下一个页面
               //resp.sendRedirect("/UserManager/mainJsp?userId="+userId);
               request.getRequestDispatcher("/ok.jsp").forward(request,response);
           }else{
               //跳回
               //resp.sendRedirect("/UserManager/loginJsp");
               request.setAttribute("errorInfo","用户Id或者密码有误");
               request.getRequestDispatcher("/login.jsp").forward(request,response);
           }
       }catch (Exception e){
           e.printStackTrace();
       }finally {
           //关闭资源
           if(rs!=null){
               try {
                   rs.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
           if(ps!=null){
               try {
                   ps.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
           if(connection!=null){
               try {
                   connection.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
       }
   %>
</body>
</html>

ok.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ok
</body>
</html>

6.2 MV模式

​ 分层开发模式

M—>model模型(Java class,业务逻辑层)

V—>view视图(JSP,界面层)

通过对model1问题的分析,我们可以对程序进行改进:

​ 1.进行分层(界面层,业务逻辑层)即:

​ model1转为界面层用jsp,业务逻辑层用Java类

​ 2.将常用的代码(比如连接数据对数据库的操作),封装到类中

image-20220219184836087

这里我们改进完以后,有心的朋友会发现,呵呵,代码真的变得清晰了,感觉有能力编写较大的网站。

6.3 MVC开发模式

MVC:M(模型) V(视图) C(控制器)

​ MVC是一种设计模式,它强制性的使应用程序的输入、处理和输出分开。

​ 使用MVC应用程序被分成了三个核心部件:模型、视图、控制器。

​ 它们各自处理自己的任务。

​ MVC的各个字母分别是M(model模型)、V(view视图)、C(controller控制器)

​ M:主要由Java类来做

​ V:由JSP来做

​ C:由Servlet来做

创建控制器的原则:同一类的业务逻辑,让一个控制器去处理

好处是:减少控制器的个数,有利于程序的维护和升级

MVC要求大家,应该是由前面的控制器为下一个JSP页面准备好数据,传给JSP页面用。

image-20220219184934103

MVC开发模式小结:

​ 现在我们总结MVC的处理过程:

​ 1.首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理

​ 2.然后调用模型来处理用户的请求并返回数据

​ 3.最后控制器用相应的视图显示模型返回的数据,并通过浏览器呈现给用户

​ MVC规定我们应该怎样去开发软件(把数据的输入,数据处理,数据显示分离)

​ web-service开发模式就是MVC模式的一种具体实现而已

​ web(JSP V +Servlet C) service M

​ web-service-dao开发模式也是MVC模式一种具体实现而已

​ web(JSP V +Servlet C) service M dao M

​ 将用户管理系统 的V部分,改成用JSP来编写。

7 应用案例

7.1 JSP计算器

方式一:2个页面

myCalInterface.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/js1.js"></script>
</head>
<body>
       <form action="/jsp_servlet_project/result.jsp" method="post">
           请输入第一个数:<input type="text" id="num1" name="num1"><br/>
           请输入第二个数:<input type="text" id="num2" name="num2"><br/>
           请选择运算符:<select name="operator">
                            <option value="+">+</option>
                            <option value="-">-</option>
                            <option value="*">*</option>
                            <option value="/">/</option>
                       </select><br/>
           <input type="submit"value="计算" οnclick="return checkNum()" />
       </form>
</body>
</html>

js1.js

//验证用户的输入是否是空的
function  checkNum() {

    var num1 = document.getElementById("num1").value;
    var num2 = document.getElementById("num2").value;

    if(num1==""||num1==null){
        alert("第一个参数不能为空");
        return false;
    }
    if(num2==""||num2==null){
        alert("第二个参数不能为空");
        return false;
    }

    //数字正则表达式
    var  reg =/^[0-9]*$;
    if(!reg.test(num1)){
        alert("第一个参数的不是一个数字");
        return false;
    }
    if(!reg.test(num2)){
        alert("第一个参数的不是一个数字");
        return false;
    }
}

result.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
     <%
        String num1 =  request.getParameter("num1");
        String num2 = request.getParameter("num2");
        String operator = request.getParameter("operator");

         double d_num1 = Double.parseDouble(num1);
         double d_num2 = Double.parseDouble(num2);

         double res = 0;
        if("+".equals(operator)){
              res = d_num1 + d_num2;
        }else if("-".equals(operator)){
            res = d_num1 - d_num2;
        }else if("*".equals(operator)){
            res = d_num1 * d_num2;
        }else if("/".equals(operator)){
            res = d_num1 / d_num2;
        }
        out.println("运行结果是:"+res);
     %>

</body>
</html>

方式二:1个页面

myCalAll.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/js1.js"></script>
</head>
<%
    String num1 =  request.getParameter("num1");
    String num2 = request.getParameter("num2");
    String operator = request.getParameter("operator");

    double d_num1 = 0;
    double d_num2 = 0;

    if(num1!=null&&num2!=null&&operator!=null){
         d_num1 = Double.parseDouble(num1);
         d_num2 = Double.parseDouble(num2);
    }

    double res = 0;
    if("+".equals(operator)){
        res = d_num1 + d_num2;
    }else if("-".equals(operator)){
        res = d_num1 - d_num2;
    }else if("*".equals(operator)){
        res = d_num1 * d_num2;
    }else if("/".equals(operator)){
        res = d_num1 / d_num2;
    }
%>
<body>
       <form action="/jsp_servlet_project/myCalAll.jsp" method="post">
           请输入第一个数:<input type="text" id="num1" name="num1" value=<%=num1 %>><br/>
           请输入第二个数:<input type="text" id="num2" name="num2" value=<%=num2 %> ><br/>
           请选择运算符:<select name="operator">
                            <option value="+">+</option>
                            <option value="-">-</option>
                            <option value="*">*</option>
                            <option value="/">/</option>
                       </select><br/>
           <input type="submit"value="计算" οnclick="return checkNum()" /><br/>
           運算結果<%=res %>
       </form>
</body>
</html>

js1.js

//验证用户的输入是否是空的
function  checkNum() {

    var num1 = document.getElementById("num1").value;
    var num2 = document.getElementById("num2").value;

    if(num1==""||num1==null){
        alert("第一个参数不能为空");
        return false;
    }
    if(num2==""||num2==null){
        alert("第二个参数不能为空");
        return false;
    }

    //数字正则表达式
    var  reg =/^[0-9]*$;
    if(!reg.test(num1)){
        alert("第一个参数的不是一个数字");
        return false;
    }
    if(!reg.test(num2)){
        alert("第一个参数的不是一个数字");
        return false;
    }
}

运行结果:

http://localhost:8080/jsp_servlet_project/myCalAll.jsp

image-20220219190654666

7.2 购物车项目

7.2.1 需求分析

​ 1.用户可以登录

​ 2.用户可以购买商品

​ 3.用户可以对购物车的商品进行修改和删除

​ 4.用户可以下订单

​ 5.系统可以发送电子邮件给用户

7.2.2 界面设计

​ 登录界面

image-20220223182553283

​ 购物大厅

image-20220223182632543

​ 我的购物车

image-20220223182708383

​ 预览订单

image-20220223182926195

​ 提交订单

image-20220223183022822

​ 查询订单

订单详情

image-20220223183125064

7.2.3 数据库设计

​ 用户表 user

create table sys_user(
  userId number primary key,  -- 用户id号
  username varchar2(50) not null,   -- 用户名
    password varchar2(50) not null, -- 密码
    email varchar2(100) not null, -- 邮箱
    tel varchar2(20) not null, -- 电话号码
    gradle number(2) default 1 not null
)

insert into sys_user values(100,'sunping','123','sunping@sohu.com','110',1);
insert into sys_user values(101,'小红','123','小红@sohu.com','111',1);

​ 商品表 book

-- 商品表
create table book(
   id number primary key,  -- 编号
   name varchar2(50) not null, -- 书名
   author varchar(100) not null, -- 作者
   publish_house varchar(100) not null,  -- 出版社
   price number not null,  -- 价格
   nums number default 1000 not null  -- 数量
)

-- 自增长
create sequence book_seq
start with 1
increment by 1
minvalue 1
maxvalue 9999999
nocycle
nocache

insert into book values(book_seq.nextval,'JSP应用开发详解','萧峰','电子工业出版社',59,100);
insert into book values(book_seq.nextval,'Java Web服务开发','谭美君','电子工业出版社',45,100);
insert into book values(book_seq.nextval,'Java编程思想','小红','机械工业出版社',99,100);
insert into book values(book_seq.nextval,'JSP编程指南','王芳','电子工业出版社',10,1000);
insert into book values(book_seq.nextval,'J2EE1.4应用开发详解','小建','电子工业出版社',68,1000);
insert into book values(book_seq.nextval,'J2EE企业级应用开发','小费','电子工业出版社',56,1000);
insert into book values(book_seq.nextval,'J2EE参考手册','小星','电子工业出版社',56,1000);
insert into book values(book_seq.nextval,'J2EE Web服务开发','顺平','电子工业出版社',55,1000);

image-20220222192402468

​ 订单表 sys_order

create table sys_order(
 id number primary key,   -- 订单号
 user_id number not null,   -- 用户号
 total_price number default 0 not null,    -- 订单总价
 order_time  date default sysdate not null   -- 时间
)

​ 订单细节表order_item

create table order_item(
  id number primary key,       -- id
  order_id number not null,    -- 订单号
  book_id  number not null,    -- 商品号
  order_num number default 0 not null --数量
)

7.2.4 程序流程图

合并1

7.2.5 代码实现

代码上传到了代码仓库,可下载

地址: https://gitee.com/tangguanlin2006/myshopping

项目结构:

image-20220225174805603

7.3 信息供求网

7.3.1 需求分析

设计2个角色:

普通用户:

​ 1.可以发布信息(求知,培训,招聘,家教…),该信息需要管理员的审核才能显示在页面

企业用户:

​ 1.可以要求管理员发布自己的广告

管理员:

​ 1.可以审核某个信息(付费信息,免费信息),是否是一条合格的信息

​ 2.可以删除信息

​ 3.可以发布付费信息

​ 4.可以发布企业广告

7.3.2 界面设计

image-20220225110417105

7.3.3 数据库设计

管理员表

()

​ 信息类别表

create table info_type(  
    id number primary key,   -- id号
    name varchar2(50) not null -- 类别名称
)

-- 初始化数据
insert into info_type values (1,'培训信息');
insert into info_type values (2,'招聘信息');
insert into info_type values (3,'家教信息');
insert into info_type values (4,'求职信息');

​ 免费信息表

create table free_info(
   id number primary key, -- 付费信息id号  自增长
   type_id number,    -- 类别id
   title varchar2(50) not null,  -- 信息标题
   context varchar2(500) not null, -- 信息内容
   linkman varchar2(50) not null,     -- 联系人名字
   linktel varchar2(20) not null,  -- 电话
   publish_date date not null,   -- 发布时间
   check_status varchar2(1) default 0 not null -- 审核状态
)
select * from free_info;

-- 创建序列
create sequence free_info_seq
start with 1
increment by 1
minvalue 1
maxvalue 9999
nocache
nocycle

-- 初始化数据
insert into free_info values(free_info_seq.nextval,4,'hello2','明天我们去爬山','顺平','110',sysdate,0);

​ 付费信息表

create table pay_info(
   id number primary key, -- 付费信息id号  自增长
   type_id number,    -- 类别id
   title varchar2(50) not null,  -- 信息标题
   context varchar2(500) not null, -- 信息内容
   linkman varchar2(50) not null,     -- 联系人名字
   linktel varchar2(20) not null,  -- 电话
   publish_date date not null,   -- 发布时间
   keep_days number default 2 not null, -- 保留天数
   check_status varchar2(1) default 0 not null -- 审核状态
)

-- 创建序列
create sequence pay_info_seq
start with 1
increment by 1
minvalue 1
maxvalue 9999
nocache
nocycle

-- 初始化数据
insert into pay_info values(pay_info_seq.nextval,4,'hello','明天我们去爬山','顺平','110',sysdate,2,0);

​ 广告表

()

7.3.4 程序框架图

(略)

7.3.5 代码实现

(略)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值