JAVAWEB

Servlet技术

JavaWeb概述

在Sun的Java Servlet规范中,对Java Web应用作了这样定义:JavaWeb应用有一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。

Java Web应用中可以包含如下内容:

Servlet

JSP

实用类------ORM

静态文档如HTML、图片等

描述Web应用的信息(web.xml)

Servelt与Servlet容器

Servlet概念

Servlet容器为JavaWeb应用提供运行时的环境,它负责管理Servlet和JSP的生命周期,以及管理它们的数据

Servlet容器也称为JavaWeb应用容器,或者Servlet/JSP容器

目前最流行的Servlet容器:

  • Tomcat
  • Resin
  • J2EE服务器(如web logic)中也提供了内置的Servlet容器

Tomcat

免费的开放源代码的Servlet容器

Web程序结构

一个web应用程序是由一组Servlet,HTML页面,类,以及其它的资源组成的运行在web服务器上的完整的应用程序,以一种结构化的有层次的目录形式存在

组成web应用程序的这些文件要部署在相应的目录层次中,根目录代表整个web应用程序的根

一个web应用程序是由一组Servlet,,HTML页面,类,以及其它的资源组成的运行在

wb服务器上的完整的应用程序,以一种结构化的有层次的目录形式存在

组成web应用程序的这些文件要部署在相应的目录层次中,根目录代表整个web应用程

序的”根”。

通常将web应用程序的目录放在webapps目录下,在webapps目录下的每一个子目录都是一个独立的web应用程序,子目录的名字就是web应用程序的名字,也就是web应用程序的“根”。用户通过web应用程序的”根”来访问wb应用程序中的资源。

Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。Servlet容器负责Servleti和客户的通信以及调用Servlet的方法,Servleti和客户的通信采用“请求/响应”的模式。

Servlet可完成如下功能:

  1. 创建并返回基于客户请求的动态HTML页面
  2. 创建可嵌入到现有HTML页面中的部分HTML页面
  3. 与其它服务器资源(数据库基于java的应用程序)进行通信

Servlet容器响应客户请求的过程

映射关系

映射细节:

同一个Servleti可以被映射到多个URL上,即多个元素的子元素的设置值可以是同一个Servlet的注册名。

在Servlet映射到的URL中也可以使用通配符,但是只能有两种固定的格式:一种格式是“扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

ServletConfig接口

Servlet在有些情况下可能需要访问Servlet容器或借助Servlet容器访问外部的资源,所以,Serlvet引擎需要将表示Servlet容器的对象传递给Servlet。另外,在web.xml文件中为某个Servlet设置的友好名称和初始化参数等信息也需要传递给该Servlet

Servlet引擎将代表Servlet容器的对象(ServletContext)和Servlet的配置参数信息一并封装到一个称为ServletConfig的对象中,并在初始化Servlets实例对象时传递给该Servlet。ServletConfig接口则用于定义ServletConfig对象需要对外提供的方法,以便在Servlet程序中可以调用这些方法来获取有关信息。

Servlet引擎调用Servlet的实例对象的init(ServletConfig config)方法将ServletConfig对象传递给Servlet,Servlet..getServletConfig0方法必须返回init(ServletConfig config)方法传递进来的这个ServletConfig对象的引用。

ServletConfig接口方法

  • getInitParameterNames
  • getInitParameter
  • getServletName
  • getServletContext

ServletContext接口

Servlet引擎为每个WEB应用程序都创建一个对应ServletContexti对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext7方法可以返回ServletContext对象的引用。

由于一个WEB应用程序中的所有Servleti都共享同一个ServletContext对象 所以 ServletContext对象被称之为application对象(Web应用程序对象)。

功能:

  1. 获取WEB应用程序的初始化参数
  2. 记录日志
  3. application域范围的属性
  4. 访问资源文件
  5. 获取虚拟路径所映射的本地路径
  6. web应用程序之间的访问
  7. ServletContext的其它方法

HTTP

在了解HTTP之前我们已经学习过了HTML(HyperText Markup Language:超文本标记语言);而实现html文件传输所使用到的一个协议即:Http。

协议:即双方(多方)之间事先约定好的规则

HTTP:HyperText Transfer Protocol(超文本传输协议),用于实现传统的web服务端和客户端之间的通信,是一种无状态协议,短连接协议;是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),是基于TCP/IP的应用层协议。

请求原理十分简单:

客户端基于http协议发送请求到服务端,服务端根据请求作出相应以http协议返回数据(html,xml,json,二进制流)

Http协议解析(报文详解)

Http协议通常由两大核心步骤组成:

  1. Http请求头
  2. Http响应头
Http请求头

http请求头的组成如下:

请求体 是否必选
GET/POST[请求方法] [URL路径] HTTP/[HTTP版本]
Host: [URL主机]
User-Agent: [请求类型唯一标识]
Accept: [设置服务器返回的数据类型]
Accept-Language:[设置服务器返回的语言]
Accept-Encoding: [设置服务器返回的压缩编码]
Accept-Charset: [设置服务器返回的文字编码]
\r\n[空行]
请求内容

请求行:

Method:请求方法(GET,POST,PUT,DELETE,OPTION,TRACE…)

URL:请求的资源地址(相对路径)

Version: http协议的版本(默认HTTP1.1)

请求头:

请求头中包含一系列请求参数,这些参数均已键值对结构形式表示,代表请求的配置信息,例如:

content-Type:text/html,text/json,/

Cookie: scroll-cookie=0

空白行:

在发送请求正文时必须保留空白行

请求体:

请求体即需要发送的数据内容:例如: username=admin&password=123456

请求头数据参考:

GET /src/index.html?name=admin&pwd=123 HTTP/1.1
Host: 192.168.6.254:8888
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6 123456789
Post和Get区别

get和post都是HTTP请求中比较常见的两种请求方式,之间区别也比较大:

GET请求:

get请求一般用于从服务端请求数据,并且也可以向服务端发送少量的数据,数据的提交方式,以字符串的形式在地址栏中拼接,由于地址栏的长度是有限制的,一般不允许超过1024字节,因此GET请求无法提交大量的数据到服务端,类似如下:

https://www.baidu.com/s?wd=http%E5%8D%8F%E8%AE%AE&rsv_spt=1&rsv_iqid=0xb52216bb00038bb7&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_dl=tb&oq=http&rsv_btype=t&rsv_t=b3f47waQnUiwHbIWG1u43avGJAbUGGPDtNp1ZhVzANcxn%2FeAJwZpmjIzIsmMtQr6sgi3&rsv_enter=0&rsv_pq=c5be2ed80004ad83&rsv_sug3=13&rsv_sug2=0&inputT=721&rsv_sug4=1133
1

POST请求:

post请求一般用于向服务端提交大量数据,由于Post请求是将请求数据通过请求头封装,因此不在地址栏中显示数据信息,post可以提交大量数据,例如文件上传

Http响应头

响应头的结构如下:

回复体 是否必须返回
HTTP/[HTTP版本] [HTTP状态]
Date: [服务器时间]
Server: [服务器类型]
Content-Type: [返回的数据流内容类型]
Content-Length:[返回的数据流内容长度]
Content-Encoding:[返回的数据流压缩编码]
Accept-Charset: [设置服务器返回的文字编码]
\r\n
回复体内容

响应行:

  • Version:Http版本(HTTP1.1)
  • http状态:http响应状态码(200,404,500,501…)

响应头:

对于客户端请求作出响应之后的响应配置信息都位于响应头中,例如:

Content-Type:text/html;charset=utf-8
Content-Length:1757
Date:Mon, 18 Jan 2021 03:41:02 GMT
123

** 空白行:**

在正式响应数据到客户端时必须保留空白行

响应体:

服务端响应回来的数据在这个位置,数据一般包含以下格式:

  • HTML
  • JSON
  • XML
  • 二进制流

HttpServletRequest

  1. HttpServletRequest 对象代表客户端的请求

  2. 当客户端/浏览器通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中

  3. 通过这个对象的方法,可以获得客户端这些信息

  4. HttpServletRequest 类图

常用方法

getRequestURI() 获取请求的资源路径 http://localhost:8080/servlet/loginServlet

getRequestURL()获取请求的统一资源定位符(绝对路径http://localhost:8080/servlet/loginServlet

getRemoteHost() 获取客户端的 主机, getRemoteAddr()

getHeader() 获取请求头

getParameter() 获取请求的参数

getParameterValues() 获取请求的参数(多个值的时候使用), 比如 checkbox, 返回的数组

getMethod() 获取请求的方式 GET 或 POST

setAttribute(key, value); 设置域数据

getAttribute(key); 获取域数据

getRequestDispatcher() 获取请求转发对象, 请求转发的核心对象

HttpServletResponse

web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。

request和response对象即代表请求和响应。我们要获取客户机提交的数据,只需要找request对象就行了;要向客户机发送数据,只需要找response对象就行了。

重定向与转发

在Java中,重定向通常是通过设置HTTP响应头来实现的,而转发则是在服务器内部将请求从一个资源转发到另一个资源,客户端不会感知这个过程。

重定向 (Redirect):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    // 重定向到另一个URL    response.sendRedirect("http://www.example.com");}

转发 (Forward):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    // 转发请求到另一个资源    RequestDispatcher dispatcher = request.getRequestDispatcher("/another-servlet");    dispatcher.forward(request, response);}

重定向会导致浏览器发起一个新的请求到指定的URL,而转发则是在服务器内部进行,客户端不会感知。在选择使用重定向还是转发时,需要考虑是否需要更新请求的URL或保持请求的上下文。

JSP技术

定义

JSP全称Java Server Pages,.是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

使用原因

(1)动态部分用Java编写,更加强大,跨平台,容易移植到其它平台。

(2)与纯 Servlets相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。

(3)与SSI相比:SSI无法使用表单数据、无法进行数据库链接。

(4)与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务;比如访问数据库和图像处理等等。

(5)与静态HTML相比:静态HTML不包含动态信息。

JSP语法

  1. 指令(Directives)

    • page

      指令:用于定义页面的属性,如内容类型、错误页面、导入类等。

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

      指令:用于在当前页面中包含其他文件。

      <%@ include file="header.jsp" %>
    • taglib

      指令:用于引入标签库。

      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  2. 脚本元素(Scripting Elements)

    • 声明

      (Declarations):用于声明方法或变量。

      <%! int globalVar = 0; %>
    • 表达式

      (Expressions):用于将Java代码的输出结果嵌入到HTML中。

      <%= "Hello, World!" %>
    • 脚本let

      (Scriptlets):用于在HTML中嵌入Java代码。

      <% for(int i = 0; i < 10; i++) { %>
      <li><%= i %></li>
      <% } %>
  3. 动作(Actions)

    • jsp:include

      动作:用于在请求时包含其他文件。

      <jsp:include page="header.jsp" />
    • jsp:forward

      动作:用于将请求转发到另一个资源。

      <jsp:forward page="target.jsp" />
    • jsp:param

      动作:用于传递参数。

      <jsp:forward page="target.jsp">
      <jsp:param name="user" value="John" />
      </jsp:forward>
  4. 标准标签库(JSTL)

    • JSTL提供了一组标准标签,用于简化JSP页面的开发。

      <c:out value="${user.name}" />
      <c:if test="${user.age >= 18}">
      <p>成年</p>
      </c:if>
  5. 表达式语言(EL)

    • EL用于简化访问页面的属性和范围变量。

      ${user.name}
  6. 注释

    • HTML注释:

      <!-- This is an HTML comment -->
    • JSP注释:

      <%-- This is a JSP comment --%>
  7. 声明(Declarations): 声明用于在JSP页面中定义类的成员变量和方法。它们是在JSP页面被转换成Servlet时,成为Servlet类的成员。声明使用<%!%>标记。

    <%!
    // 类变量声明
    private static final String COPYRIGHT = "Copyright 2023"; // 方法声明
    public void printCopyright() {
    out.println(COPYRIGHT);
    }
    %>
  8. 表达式(Expressions): 表达式用于将Java代码的执行结果输出到HTML页面中。表达式使用<%=%>标记。

    <%= "Hello, World!" %>
    <%= new java.util.Date() %>
  9. 脚本let(Scriptlets): 脚本let是在JSP页面中嵌入的Java代码片段,它们在每次请求页面时都会被执行。脚本let使用<%%>标记。

    <%
    // Java代码片段
    int sum = 5 + 5;
    String message = "The sum is " + sum;
    %>
    <p><%= message %></p>
  10. 注释: JSP支持HTML注释和JSP注释。HTML注释会在客户端可见的HTML源代码中显示,而JSP注释仅在JSP源文件中可见,不会发送到客户端。

    • HTML注释:

      <!-- This comment will be visible in the HTML source -->
    • JSP注释:

      <%-- This comment will not be visible in the HTML source --%>

在实际的JSP页面中,这些语句可以与HTML标记混合使用,以创建动态内容。例如,一个简单的JSP页面可能包含一个用于显示当前时间的表达式:

<html>
<head>
<title>Current Time</title>
</head>
<body>
<h1>The current time is:</h1>
<%= new java.util.Date().toString() %>
</body>
</html>

在这个例子中,<%= new java.util.Date().toString() %>是一个表达式,它将在页面加载时执行,并将当前时间的字符串表示输出到HTML中。

JSP客户端请求

在JSP中,客户端请求通常指的是用户通过Web浏览器或其他客户端应用程序发送到服务器的HTTP请求。JSP页面可以处理这些请求并生成动态响应。以下是如何在JSP中获取和处理客户端请求的几种方法:

  1. 获取请求参数: 客户端请求通常包含参数,这些参数可以通过HttpServletRequest对象的getParameter方法获取。

    <%
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    %>
  2. 获取请求属性: 请求属性是请求的一部分,可以在请求的生命周期内在服务器端设置和检索。

    <%
    String attributeName = request.getAttribute("attributeName");
    %>
  3. 获取请求头信息: 请求头包含了关于请求的元数据,如用户代理、内容类型等。

    <%
    String userAgent = request.getHeader("User-Agent");
    %>
  4. 获取请求方法: 请求方法(如GET或POST)可以通过getMethod方法获取。

    <%
    String method = request.getMethod();
    %>
  5. 获取请求URL和路径信息: 请求的URL和路径信息可以通过getRequestURLgetRequestURI方法获取。

    <%
    String requestURL = request.getRequestURL().toString();
    String requestURI = request.getRequestURI();
    %>
  6. 获取客户端IP地址: 客户端的IP地址可以通过getRemoteAddr方法获取。

    <%
    String clientIP = request.getRemoteAddr();
    %>
  7. 处理表单数据: 当客户端通过HTML表单提交数据时,这些数据会作为请求参数发送到服务器。在JSP中,可以使用getParameter方法来获取这些参数。

    <%
    String name = request.getParameter("name");
    String email = request.getParameter("email");
    %>
  8. 处理文件上传: JSP可以通过使用commons-fileupload库或Java EE的javax.servlet.http.Part接口来处理文件上传。

    <%
    Part filePart = request.getPart("file");
    // 处理文件上传
    %>

在JSP中处理客户端请求时,通常需要考虑异常处理和输入验证,以确保应用程序的安全性和健壮性。此外,对于复杂的业务逻辑,通常会将请求处理逻辑放在Servlet中,而将JSP用于页面展示。

MVC

MVC是Model-View-Controller的简称,即模型-视图-控制器。是一种设计模式,它把应用程序分成三个核心模块:模型 视图 控制器他们各自处理自己的业务

模型的代码只需写一次就可以被多个视图重用,所以提高了代码的可重用性

视图是用户看到并与之交互的界面,视图向用户显示相关的数据、接受用户的输入、不进行任何实际的业务处理

控制器接受用户的输入并调用模型和视图去完成用户的需求。控制器接收请求并决定调用哪个模型组件去处理请求,然后决定调用哪个视图来显示模型处理返回的数据

过滤器Filter

概念

Filter的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理的前后实现一些特殊功能

在Servlet API中定义了三个接口类供开发人员编写Filter程序:Filter FilterChain FilterConfig

Filter程序是一个实现了Filter接口的Java类,与Servlet程序相似,它由Servlet容器进行调用和执行

Filter程序需要在web.xml文件中进行注册和设置它所能拦截的资源:Filter程序可以拦截Jsp,Servlet,不拦截静态图片文件和静态html文件

Filter接口

public voic init(FilterConfig filterConfig)throws ServletException

1、在Web应用程序启动时,Web服务器(Web容器)将根据其web.xml文件的配置信息来创建每个注册的Filter的实例对象,并将其保存在内存中。

2、Web容器创建Filter的实例对象后,将立即调用该Filter对象的init方法。init方法在Filter生命周期中仅被执行一次,Web容器在调用init方法时,会传递一个包,含Filter的配置和运行环境信息的FilterConfig对象。

doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws

java.io.IOException,ServletException:

参数request和response为Web容器或Filter链中上一个Filter传递过来的请求和响应对象;参数chain为代表当前Filter链的对象。

destroy方法

该方法在Web容器卸载Filter对象之前被调用,也仅执行一次。可以完成与init方法相反的功能,释放被该Filter对象打开的资源,例如:关闭数据库连接和IO流。

FilterConfig接口

javax.servlet.FilterConfig接口:该接口类似于ServletConfig接口,由容器实现。Servlet规范将代表

ServletContext对象和Filter的配置参数信息都封装在该对象中。Servlet容器将其作为参数传入过滤器对象的init()方法中

String getFilterName():得到描述符中指定的过滤器的名字

String getlnitParameter(String name):返回在部署描述中指定的名字为name的初始化参数的值。如果不存在返回null

Enumeration getlnitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合

public ServletContext getServletContext():返回Servlet上下文对象的引用

FilterChain接口

FilterChain接口:代表当前Filter链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中最后一个过滤器,那么将调用目标资源。

doFilter(ServletRequest request,ServletResponse response)throws java.io.IOException:调用该方法将使过滤器链中的下一个过滤器被调用。如果是最后一个过滤器,会调用目标资源。

文件上传

如果在表单中使用表单元素,浏览器在解析表单时,会自动生成一个输入框和一个按钮 输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件

Enctype属性

当表单需要上传文件时,需指定表单enctype的值为multipart/,form-data

在form元素的语法中,enctype属性指定将数据发送到服务器时浏览器使用的编码类型。

enctype属性取值:

application/,x-ww-form-urlencoded:表单enctype属性的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字时,必须用”%HH”代替(H代表十六进制数字)。对于大容量的二进制数据或包含非ASCII字符的文本来说,这种编码不能满足要求。

multipart/form-data:form设定了enctype=“multipart/form-data”属性后,表示表单以二进制传输数据

Commons-fileupload组件

Commons-fileupload组件是Apache开源代码组织用来处理表单文件上传的一个子项目,该组件性能优异,可以支持任意大小的文件上传

Commons-fileupload组件1.1版本开始依赖Apache的另一个项目:commons-io

上传基本原理

FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)都看作一样的filetem,这样上宣传页面提交的reuqest请求也就是一个Filetem的有序组合,FIleUpload组件可以解析该request,并返回一个个filetem

对每个fileItem,fileupload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是表单域,就读其值,如果是文件域,就保存文件到服务器硬盘上或者内存中

Commons-fileupload组件API

主要的三个接口和类:

ServletFileUpload负责处理上传的文件数据,并将每部分的数据封装成一到Fileltem对象中。

DiskFileltemFactory是创建Fileltem对象的工厂,在这个工厂类中可以配置内存缓冲区大小和存放临时文件的目录。

ServletFileUpload在接收上传文件数据时,会将内容保存到内存缓存区中,如果文件内容超过了

DiskFileltemFactory指定的缓冲区的大小,那么文件将被保存到磁盘上,存储为DiskFileltemFactory指定目录中的临时文件。等文件数据都接收完毕后,ServletUpload在从文件中将数据写入到上传文件目录下的文件中

文件下载

情景:在一些网络系统中,需要隐藏下载文件的真实地址,或者下载的文件需要一个程序来动态的确定后再传送给客户端

防范:利用程序编码实现下载

可以增加安全访问机制,只经过授权认证的用户提供下载

可以从任意位置提供下载的数据

利用程序实现下载需要设置2个报头:

1、Web服务器需要告诉浏览器其所输出的内容的类型不是普通的文本文件或HTML文件,而是一个要保存到本地的下载文件。设置Content-Type的值为:application/x-msdownload

2、Web服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置Content-.Disposition报头。该报头指定了接收程序处理数据内容的方式,在HTTP应用中只有attachment是标准方式,attachment表示要求用户干预。在attachment后面还可以指定filename参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。在设置Content-.Dispostion之前一定要指定Content-Type.

综合案例-体育商品网站

注意:本项目要求使用mysql5.0版本,否则因技术要求出现高版本不兼容的问题

导入数据库文件(navicat)

/*
Navicat MySQL Data Transfer Source Server : 5.5
Source Server Version : 50529
Source Host : localhost:3306
Source Database : typsrc1 Target Server Type : MYSQL
Target Server Version : 50529
File Encoding : 65001 Date: 2023-02-04 19:40:05
*/ SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for t_admin
-- ----------------------------
DROP TABLE IF EXISTS `t_admin`;
CREATE TABLE `t_admin` (
`userId` int(11) NOT NULL DEFAULT '0',
`userName` varchar(300) DEFAULT '',
`userPw` varchar(600) DEFAULT '',
`userType` varchar(765) DEFAULT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_admin
-- ----------------------------
INSERT INTO `t_admin` VALUES ('1', 'admin', '654321', '管理员'); -- ----------------------------
-- Table structure for t_catelog
-- ----------------------------
DROP TABLE IF EXISTS `t_catelog`;
CREATE TABLE `t_catelog` (
`catelog_id` int(11) NOT NULL DEFAULT '0',
`catelog_name` varchar(600) DEFAULT '',
`catelog_miaoshu` varchar(600) DEFAULT '',
`catelog_del` varchar(600) DEFAULT '',
PRIMARY KEY (`catelog_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_catelog
-- ----------------------------
INSERT INTO `t_catelog` VALUES ('0', '3', '3', '');
INSERT INTO `t_catelog` VALUES ('1', '健身', '健身1', 'no');
INSERT INTO `t_catelog` VALUES ('2', '球类', '球类', 'no');
INSERT INTO `t_catelog` VALUES ('3', '武术', '武术', 'no');
INSERT INTO `t_catelog` VALUES ('4', '益智', '益智', 'no'); -- ----------------------------
-- Table structure for t_gonggao
-- ----------------------------
DROP TABLE IF EXISTS `t_gonggao`;
CREATE TABLE `t_gonggao` (
`gonggao_id` int(11) NOT NULL DEFAULT '0',
`gonggao_title` longtext,
`gonggao_content` longtext,
`gonggao_data` longtext,
`gonggao_fabuzhe` longtext,
`gonggao_del` longtext,
`gonggao_one1` longtext,
`gonggao_one2` longtext,
`gonggao_one3` longtext,
`gonggao_one4` longtext,
`gonggao_one5` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`gonggao_one6` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`gonggao_one7` int(11) DEFAULT NULL,
`gonggao_one8` int(11) DEFAULT NULL,
PRIMARY KEY (`gonggao_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_gonggao
-- ----------------------------
INSERT INTO `t_gonggao` VALUES ('1', '新品上市...', '<strong>三天后,有新货到店。<br />\r\n喜欢的朋友赶紧来看!!!<br />\r\n</strong><br />', '2017-5-3 14:37:44', null, null, null, null, null, null, '2019-07-30 15:30:36', '2017-05-03 14:37:44', null, null); -- ----------------------------
-- Table structure for t_goods
-- ----------------------------
DROP TABLE IF EXISTS `t_goods`;
CREATE TABLE `t_goods` (
`goods_id` int(11) NOT NULL DEFAULT '0',
`goods_name` longtext,
`goods_miaoshu` longtext,
`goods_pic` longtext,
`goods_yanse` longtext,
`goods_shichangjia` int(11) DEFAULT NULL,
`goods_isnottejia` longtext,
`goods_isnottuijian` longtext,
`goods_catelog_id` int(11) DEFAULT NULL,
`goods_del` longtext,
`goods_dianji` int(11) DEFAULT NULL,
`goods_kucun` int(11) DEFAULT NULL,
`goods_tejia` varchar(255) DEFAULT NULL,
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_goods
-- ----------------------------
INSERT INTO `t_goods` VALUES ('1', '20230204-122222', '20230204-1222222', '/upload/1457614594373.jpg', 'J001', '40', 'no', null, '0', 'no', '3', '99', null);
INSERT INTO `t_goods` VALUES ('2', '足球', '商品名称:足球<br />\r\n上市时间:2017-4<br />\r\n产地:巴西<br />\r\n<br />', '/upload/1457614594373.jpg', 'Q001', '500', 'no', null, '2', 'no', '8', '22', null);
INSERT INTO `t_goods` VALUES ('3', '拳击手套', '商品名称:拳击手套<br />\r\n上市时间:2017-5<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127081039.jpg', 'W001', '100', 'no', null, '3', 'no', '2', '194', null);
INSERT INTO `t_goods` VALUES ('4', '围棋', '商品名称:围棋<br />\r\n上市时间:2017-3<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127081520.jpg', 'Y001', '75', 'no', null, '4', 'no', '3', '99', null);
INSERT INTO `t_goods` VALUES ('5', '仰卧板', '商品名称:仰卧板<br />\r\n上市时间:2017-3<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127080645.jpg', 'J002', '170', 'no', null, '1', 'no', '4', '194', null);
INSERT INTO `t_goods` VALUES ('6', '乒乓球拍', '商品名称:乒乓球拍<br />\r\n上市时间:2017-5<br />\r\n产地:中国<br />\r\n<br />', '/upload/pai.jpg', 'Q002', '140', 'no', null, '2', 'no', '4', '296', null);
INSERT INTO `t_goods` VALUES ('7', '双节棍', '商品名称:双节棍<br />\r\n上市时间:2017-3<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127081156.jpg', 'W002', '120', 'no', null, '3', 'no', '9', '390', null);
INSERT INTO `t_goods` VALUES ('8', '国际象棋', '商品名称:国际象棋<br />\r\n上市时间:2017-4<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127081653.jpg', 'Y002', '170', 'no', null, '4', 'no', '3', '199', null);
INSERT INTO `t_goods` VALUES ('9', '哑铃', '商品名称:哑铃<br />\r\n上市时间:2017-4<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127080833.jpg', 'J003', '110', 'no', null, '1', 'no', '8', '23', null);
INSERT INTO `t_goods` VALUES ('10', '足球', '商品名称:足球<br />\r\n上市时间:2017-3<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127080119.jpg', 'Q003', '230', 'no', null, '2', 'no', '6', '299', null);
INSERT INTO `t_goods` VALUES ('11', '太极服', '商品名称:太极服<br />\r\n上市时间:2017-4<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127081354.jpg', 'W003', '210', 'no', null, '3', 'no', '11', '148', null);
INSERT INTO `t_goods` VALUES ('12', '中国象棋', '商品名称:中国象棋<br />\r\n上市时间:2017-5<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127081826.jpg', 'Y003', '100', 'no', null, '4', 'yes', '15', '294', null);
INSERT INTO `t_goods` VALUES ('13', '中国象棋', '商品名称:中国象棋<br />\r\n上市时间:2017-4<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127082133.jpg', 'Y', '100', 'no', null, '4', 'yes', '0', '200', null);
INSERT INTO `t_goods` VALUES ('14', '中国象棋', '商品名称:中国象棋<br />\r\n上市时间:2017-3<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127082133.jpg', 'Y003', '100', 'no', null, '4', 'yes', '0', '150', null);
INSERT INTO `t_goods` VALUES ('15', '中国象棋', '商品名称:中国象棋<br />\r\n上市时间:2017-3<br />\r\n产地:中国<br />\r\n<br />', '/upload/20181127082000.jpg', 'Y003', '100', 'no', null, '4', 'no', '8', '110', null); -- ----------------------------
-- Table structure for t_liuyan
-- ----------------------------
DROP TABLE IF EXISTS `t_liuyan`;
CREATE TABLE `t_liuyan` (
`liuyan_id` int(11) NOT NULL DEFAULT '0',
`liuyan_title` longtext,
`liuyan_content` longtext,
`liuyan_date` longtext,
`liuyan_user` longtext,
PRIMARY KEY (`liuyan_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_liuyan
-- ----------------------------
INSERT INTO `t_liuyan` VALUES ('1', '建议', '<strong>乒乓球拍的质量虽然不错,但是球不怎么样,希望可以提高球的质量!!!</strong><br />', '2017-5-3 15:06:06', 'wkl');
INSERT INTO `t_liuyan` VALUES ('2', '足球', '希望有更多的足球品牌!<br />', '2017-5-24 13:29:30', 'wkl'); -- ----------------------------
-- Table structure for t_order
-- ----------------------------
DROP TABLE IF EXISTS `t_order`;
CREATE TABLE `t_order` (
`order_id` int(11) NOT NULL DEFAULT '0',
`order_bianhao` varchar(300) DEFAULT '',
`order_date` varchar(300) DEFAULT '',
`order_zhuangtai` varchar(600) DEFAULT '',
`order_jine` int(11) DEFAULT NULL,
`order_songhuodizhi` varchar(300) DEFAULT '',
`order_fukuangfangshi` varchar(300) DEFAULT '',
`order_user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_order
-- ----------------------------
INSERT INTO `t_order` VALUES ('3', '20170503145900', '2020-05-03 14:59:00', 'ping', '500', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('4', '20170503145937', '2020-05-03 14:59:37', 'ping', '680', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('5', '20170503150009', '2029-05-03 15:00:09', 'ping', '420', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('8', '20170508222339', '2020-05-08 22:23:39', 'ping', '100', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('9', '20170510224103', '2020-05-10 22:41:03', 'ping', '220', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('10', '20170510225135', '2020-05-10 22:51:35', 'ping', '240', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('11', '20170521000234', '2020-05-21 00:02:34', 'shou', '110', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('12', '20170521000456', '2020-05-21 00:04:56', 'shou', '100', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('13', '20170523163845', '2020-05-23 16:38:45', 'yes', '210', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('14', '20170523195429', '2020-05-23 19:54:29', 'no', '75', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('15', '20170605154630', '2020-06-05 15:46:30', 'shou', '110', '山西太原', '货到付款', '7');
INSERT INTO `t_order` VALUES ('16', '20181127082816', '2020-11-27 08:28:16', 'yes', '430', '湖北省荆州市', '货到付款', '12'); -- ----------------------------
-- Table structure for t_orderitem
-- ----------------------------
DROP TABLE IF EXISTS `t_orderitem`;
CREATE TABLE `t_orderitem` (
`orderItem_id` int(11) NOT NULL DEFAULT '0',
`order_id` int(11) DEFAULT NULL,
`goods_id` int(11) DEFAULT NULL,
`goods_quantity` int(11) DEFAULT NULL,
PRIMARY KEY (`orderItem_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_orderitem
-- ----------------------------
INSERT INTO `t_orderitem` VALUES ('3', '3', '3', '5');
INSERT INTO `t_orderitem` VALUES ('4', '4', '5', '4');
INSERT INTO `t_orderitem` VALUES ('5', '5', '6', '3');
INSERT INTO `t_orderitem` VALUES ('8', '8', '12', '1');
INSERT INTO `t_orderitem` VALUES ('9', '9', '9', '2');
INSERT INTO `t_orderitem` VALUES ('10', '10', '7', '2');
INSERT INTO `t_orderitem` VALUES ('11', '11', '9', '1');
INSERT INTO `t_orderitem` VALUES ('12', '12', '3', '1');
INSERT INTO `t_orderitem` VALUES ('13', '13', '11', '1');
INSERT INTO `t_orderitem` VALUES ('14', '14', '4', '1');
INSERT INTO `t_orderitem` VALUES ('15', '15', '9', '1');
INSERT INTO `t_orderitem` VALUES ('16', '16', '9', '2');
INSERT INTO `t_orderitem` VALUES ('17', '16', '11', '1'); -- ----------------------------
-- Table structure for t_ping
-- ----------------------------
DROP TABLE IF EXISTS `t_ping`;
CREATE TABLE `t_ping` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(2295) DEFAULT NULL,
`orderitem_id` varchar(2295) DEFAULT NULL,
`goods_id` varchar(333) DEFAULT NULL,
`mingcheng` varchar(2295) DEFAULT NULL,
`user_id` varchar(2295) DEFAULT NULL,
`loginname` varchar(2295) DEFAULT NULL,
`info` varchar(2295) DEFAULT NULL,
`adddate` varchar(2295) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_ping
-- ----------------------------
INSERT INTO `t_ping` VALUES ('1', '1', '1', '7', '双节棍', '7', 'wkl', '质量不错,外观也挺漂亮', '2017-5-3 15:03:02');
INSERT INTO `t_ping` VALUES ('2', '2', '2', '2', '足球', '7', 'wkl', '颜色非常好看', '2017-5-3 15:03:26');
INSERT INTO `t_ping` VALUES ('3', '3', '3', '3', '拳击手套', '7', 'wkl', '用了一个月,很耐用', '2017-5-3 15:03:44');
INSERT INTO `t_ping` VALUES ('4', '4', '4', '5', '仰卧板', '7', 'wkl', '质量非常棒', '2017-5-3 15:04:00');
INSERT INTO `t_ping` VALUES ('5', '5', '5', '6', '乒乓球拍', '7', 'wkl', '挺不错的球拍,用着挺顺手', '2017-5-3 15:04:28');
INSERT INTO `t_ping` VALUES ('6', '7', '7', '12', '中国象棋', '7', 'wkl', '棋子的手感很好,很开心的一次购物!!!', '2017-5-6 8:53:47');
INSERT INTO `t_ping` VALUES ('7', '9', '9', '9', '哑铃', '7', 'wkl', '哑铃质量不错,挺好的', '2017-5-10 22:42:30');
INSERT INTO `t_ping` VALUES ('8', '10', '10', '7', '双节棍', '7', 'wkl', '双节棍质量不错', '2017-5-10 22:52:57');
INSERT INTO `t_ping` VALUES ('9', '8', '8', '12', '中国象棋', '7', 'wkl', '质量很好', '2017-5-24 13:28:24'); -- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`user_id` int(11) NOT NULL DEFAULT '0',
`user_name` varchar(300) DEFAULT '',
`user_pw` longtext,
`user_type` int(11) DEFAULT NULL,
`user_realname` longtext,
`user_address` longtext,
`user_sex` longtext,
`user_tel` longtext,
`user_email` longtext,
`user_qq` longtext,
`user_man` longtext,
`user_age` longtext,
`user_birthday` longtext,
`user_xueli` longtext,
`user_del` longtext,
`user_one1` longtext,
`user_one2` longtext,
`user_one3` longtext,
`user_one4` longtext,
`user_one5` longtext,
`user_one6` int(11) DEFAULT NULL,
`user_one7` int(11) DEFAULT NULL,
`user_one8` int(11) DEFAULT NULL,
`user_one9` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_one10` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`user_one11` int(11) DEFAULT NULL,
`user_one12` int(11) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES ('7', 'wxl', '123456', '0', '王小林', '山西省太原市', '男', '15234098067', '947342283@qq.com', '15234098067', null, null, null, null, 'no', null, null, null, null, null, null, null, null, '2018-11-27 08:26:48', '2017-05-02 14:37:09', null, null);
INSERT INTO `t_user` VALUES ('8', 'zjk', '1234', '0', '张健康', '湖南省长沙市', '男', '15934098069', '947342226@qq.com', '947342283', null, null, null, null, 'no', null, null, null, null, null, null, null, null, '2018-11-27 08:27:14', '2017-05-03 14:56:54', null, null);

搭建完成

部署项目总结

  1. 考虑数据库版本,考虑创建数据库设置的编码,考虑数据库服务是否正常开启,程序是否因为链接信息(ip、端口、账号、密码、jdbc驱动、库名(要和项目数据库版本一致))
  2. 部署期间404问题,源码part的API报错原因是因为??
    1. 需要要求用tomcat8.5手动引入lib
  3. 考虑因为数据库设置编码、数据本身乱码、前端编码、后端编码、idea编码、tomcat编码导致中文乱码问题
  4. 端口占用问题

代码审计——基础(JAVAWEB)的更多相关文章

  1. php代码审计基础笔记

    出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 --------------------------- ...

  2. [代码审计基础 04]ssrf漏洞的利用&伪协议

    ssrf漏洞的利用&伪协议 0x1 SSRF原理解析 什么是ssrf SSRF (Server-Side Request Forgery,服务端请求伪造)是指攻击者向服务端发送包含恶意URL链 ...

  3. PHP代码审计基础-高级篇

    高级篇主要讲 1. 熟知各个开源框架历史版本漏洞. 2. 业务逻辑漏洞 3. 多线程引发的漏洞 4. 事务锁引发的漏洞 在高级篇审计中有很多漏洞正常情况下是不存在的只有在特殊情况下才有 PHP常用框架 ...

  4. PHP代码审计基础-中级篇

    初级篇更多是对那些已有的版本漏洞分析,存在安全问题的函数进行讲解,中级篇更多是针对用户输入对漏洞进行利用 中级篇更多是考虑由用户输入导致的安全问题. 预备工具首先要有php本地环境可以调试代码 总结就 ...

  5. PHP代码审计基础-初级篇

    对于php代码审计我也是从0开始学的,对学习过程进行整理输出沉淀如有不足欢迎提出共勉.对学习能力有较高要求,整个系列主要是在工作中快速精通php代码审计,整个学习周期5天 ,建议花一天时间熟悉php语 ...

  6. PHP代码审计基础

    php核心配置 php.ini 基本配置 语法 大小写敏感 运算符 空值的表达式 安全模式 安全模式 safe_mode = off 用来限制文档的存取,限制环境变量的存取,控制外部程序的执行.PHP ...

  7. [代码审计基础 15]phpmcs_v9.6 rce

    PHP:5.4.5 设置调试:https://blog.csdn.net/m0_46641521/article/details/120107786 版本:phpcms_v9.6.0_UTF8 0x0 ...

  8. [代码审计基础 14]某cms变量覆盖到N处漏洞

    PHP:5.4.5 设置调试:https://blog.csdn.net/m0_46641521/article/details/120107786 PHPCMS变量覆盖到SQL注入 0x01:路由分 ...

  9. PHP代码审计---基础

    PHP伪协议 PHP伪协议事实上是其支持的协议与封装协议,支持的种类有以下12种. * file:// - 访问本地文件系统 * http:// - 访问 HTTP(s) 网址 * ftp:// - ...

  10. 【代码审计】PHP代码审计---基础记录

    PHP伪协议 PHP伪协议事实上是其支持的协议与封装协议,支持的种类有以下12种. * file:// - 访问本地文件系统 * http:// - 访问 HTTP(s) 网址 * ftp:// - ...

随机推荐

  1. python pickle模块,打包创建的对象,做持久化

    pickle提供了一个简单的持久化功能.可以将对象以文件的形式存放在磁盘上. pickle.dump(obj, file[, protocol]) 序列化对象,并将结果数据流写入到文件对象中.参数pr ...

  2. 消息队列Kafka「检索组件」重磅上线!

    ​简介:本文对消息队列 Kafka「检索组件」进行详细介绍,首先通过对消息队列使用过程中的痛点问题进行介绍,然后针对痛点问题提出相应的解决办法,并对关键技术技术进行解读,旨在帮助大家对消息队列 Kaf ...

  3. 10倍性能提升!DLA SQL推出基于Alluxio的数据湖分析加速功能

    简介: 在存储计算分离的场景下,通过网络从远端存储读取数据是一个代价较大的操作,往往会带来性能的损耗.以OSS为例,OSS数据读取延时通常较本地磁盘大很多,同时OSS对单个用户使用的带宽上限做了限制, ...

  4. 评审恩仇录——IDE也能做代码评审?

    简介: 云效Codeup推出了本地IDE插件端的评审,免除了黄药师来回华山的奔波之苦 现代科技公司的同事们平日一起交流开发规约和产品需求,肩上共同扛着业务发展和同行竞争的压力,这份还书贻剑的情谊如何能 ...

  5. QUIC技术创新 让视频和图片分发再提速

    ​简介:在1月12日的「阿里云CDN产品发布会-新一代传输协议QUIC让CDN更快一步」之上,阿里云技术专家淮叶分享了QUIC技术及其应用落地实践,内容包含:QUIC协议介绍.相比TCP有哪些优势.应 ...

  6. Spring官方RSocket Broker 0.3.0发布: 快速构建你的RSocket架构

    ​简介:Spring官方的RSocket Broker其实开发已经非常久了,我以为会伴随着Spring Cloud 2021.0发布的,但是没有发生.不过Spring RSocket Broker还是 ...

  7. [FAQ] jsoneditor 如何切换 mode 或者选择 modes

    1. 用于切换编辑器模式:text.tree.code JSONEditor.setMode(mode) 2. 让 mode 变成可以选择的: const options = { modes: ['t ...

  8. [FAQ] 夏玉米 按规则查询域名靠谱吗 ?

    很早就有一个网站叫 夏玉米,可以按规则查询和注册域名,那么它真如我们想的那样 可以找到好域名吗? 虽然看起来很好用,实际上夏玉米的查询只是针对它自己的数据库,不包含未在其平台注册的域名,所以大家要失望 ...

  9. WPF 简单实现一个支持删除自身的应用

    我准备写一个逗比的应用,然而我担心被小伙伴看到这个应用的文件从而知道是我写的,于是我就需要实现让应用能自删除的功能.核心实现方法就是调用 cmd 传入命令行,等待几秒之后删除文件 应用程序在运行时,是 ...

  10. Redisant Toolbox——面向开发者的多合一工具箱

    Redisant Toolbox--面向开发者的多合一工具箱 Redisant Toolbox 拥有超过30种常用的开发工具:精心设计,快速.高效:离线使用,尊重您的隐私.官网地址:http://ww ...