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
8.JSP是一种动态网页技术
2 JSP快速入门
-
language 表示jsp的片段语言,表示这是JSP页面
-
在<% %> 可以写我们的Java代码,就和我们在Java文件中写Java代码是一样的
有多个<% %>其实相当于一个大的<% %>,在<% %>会成为service函数的局部变量
-
为什么可以直接使用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
。 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的运行原理:单实例
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排版标签时如何被发送到客户端的?
。JSP页面汇总的Java代码,服务器是如何执行的?
。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对象 |
---|---|
out | JspWriter |
request | HttpServletRequest |
response | HttpServletResponse |
session | HttpSession |
application | ServletContext |
config | ServletConfig |
pageContext | pageContext |
page | this |
exception | Exception |
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
3.taglib标签指令
这个指令允许在jsp页面使用自定义的标签
<myTag: yourTag num1="123" >
5.2 脚本元素
脚本元素:可以理解就是java的片段
- <% java代码 %>
<%
Date date = new Date();
out.println("hello,wolrd" + "当前日期="+date);
%>
- 表达式 <% =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返回前端浏览器。
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.将常用的代码(比如连接数据对数据库的操作),封装到类中
这里我们改进完以后,有心的朋友会发现,呵呵,代码真的变得清晰了,感觉有能力编写较大的网站。
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页面用。
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
7.2 购物车项目
7.2.1 需求分析
1.用户可以登录
2.用户可以购买商品
3.用户可以对购物车的商品进行修改和删除
4.用户可以下订单
5.系统可以发送电子邮件给用户
7.2.2 界面设计
登录界面
购物大厅
我的购物车
预览订单
提交订单
查询订单
订单详情
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);
订单表 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 程序流程图
7.2.5 代码实现
代码上传到了代码仓库,可下载
地址: https://gitee.com/tangguanlin2006/myshopping
项目结构:
7.3 信息供求网
7.3.1 需求分析
设计2个角色:
普通用户:
1.可以发布信息(求知,培训,招聘,家教…),该信息需要管理员的审核才能显示在页面
企业用户:
1.可以要求管理员发布自己的广告
管理员:
1.可以审核某个信息(付费信息,免费信息),是否是一条合格的信息
2.可以删除信息
3.可以发布付费信息
4.可以发布企业广告
7.3.2 界面设计
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 代码实现
(略)