RESTful Web

最近老师碰到一个词汇——RESTful Web Service ,其实经常碰到它,只是不知道它名字罢了,但又总觉得漏掉了什么,于是通过google君了解了一下它的本质,做一些总结,顺便从官网搬了一些更准确的内容下来

  • RESTful Web服务是松散耦合的轻量级Web服务,特别适合为遍布Internet的客户端创建API。代表性状态转移(REST)是客户端-服务器应用程序的体系结构样式,其中心在于通过请求和响应进行资源的代表性转移。
  • 在REST体系结构样式中,数据和功能被视为资源,并使用统一资源标识符(URI)(通常是Web上的链接)进行访问。资源由文档表示,并通过使用一组简单的,定义明确的操作对其进行操作。
  • REST体系结构样式设计为使用无状态通信协议,通常为HTTP。在REST体系结构样式中,客户端和服务器通过使用标准化的接口和协议来交换资源的表示形式。
  • 一些原则鼓励RESTful Web变简单
< 通过URL进行资源标识>
<统一界面:PUT,GET,POST,DELETE>
<自我描述信息:资源与他们的表示分离>
<通过连接状态交互: 与资源的每次交互都是无状态的;也就是说,请求消息是独立的。有状态的交互基于显式状态转移的概念。 >

spring实现hello world

|开头得hello world一波,通过hello world 了解一下spring boot是怎样运足的,但是现在理解肯定不是很深入,先暂时记录一下干了什么,以及别人博客中提及的一些过滤内容|
  • 搭建一个基本的maven项目,idea自带命令行参数,可用mvn archetype:generate命令(其实可以直接建立新的maven空项目,再配置pom.xml)
mvn archetype:generate -DgroupId=springboot -DartifactId=springboot-helloworld -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  • 配置pom.xml,加入spring boot启动父依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>springboot</groupId>
    <artifactId>springboot-helloworld</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-helloworld :: HelloWorld Demo</name>

    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.3.RELEASE</version>
    </parent>

    <dependencies>
        <!-- Spring Boot web依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>
|进行到这里的时候突然发现时间过去了1个小时,中间经历了配置maven仓库,死活姿势不对,然后下载速度很慢,去搞代理呢又姿势不正确,导致速度很慢,时间就这样过去了,烦!!!最后搞阿里仓库方案解决一下,然后就速度变快了|
  • Controller层
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Spring boot Helloworld 例子
 */
@RestController
public class HelloWorldController {
     @RequestMapping("/")
     public String sayHello(){
         return "Hello,World!";
     }
}
/**1. @RestController:提供实现了REST API,可以服务JSON,XML或者其他。这里是以String的形式渲染出结果。 
2. @RequestMapping:提供路由信息,"/“路径的HTTP Request都会被映射到sayHello方法进行处理。
**/ 
|上边的所说的过程,理解不是特别深刻,但是继续完后边儿的应该会有个大概理解|
  • Application启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Spring Boot 启动类
 */
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

/**
1. @SpringBootApplication:Spring Boot 应用的标识 
2. Application很简单,一个main函数作为主入口。SpringApplication引导应用,并将Application本身作为参数传递给run方法
*/
|最后时间又停止下边儿了,第一次写测试类,写了一个十分垃圾的测试类,自己想当然写的,反正先筹和一下,时间过去好久了都,我的天|
  • Controller测试类
import org.junit.Test;

/**
 * Controller 测试类
 */
public class HelloWorldControllerTest {
    @Test
    public void testSayHello(){
        if ("Hello,World!"!=new HelloWorldController().sayHello()) throw new AssertionError();
    }
}
/**
好丑的测试,哎先就这样一波
*/
|然后就到激动人心的时候了啊!!点击运行,然后出现一堆错误,其中包括引用方法错误,格式错误,然后测试类方法写的不正确,又是一番踩坑之后,最终版见上边儿|

|第一maven下的spring boot项目就圆满完成了,其中遇到了很多问题,解决方法:官网查文档,验证idea弹出来的解决方案|

idea搭建spring项目

| 开始学习spring,前边儿学的基本上都忘的差不多了,害~又得从头学习~|
| 从官网的guid学起走吧那就,开始咯~ |
  • 首先学会爬,看如何利用spring initializr 搭建spring 项目。新建一个spring项目的时候,勾一下就好了。
  • 点击next后出现工程信息,type可以修改工程类型,language可以选择语言
  • 点击next,进入版本选择,以及依赖关系选择
  • 点击next,进入工程物理的一些细节选项
spring-initializr-in-intellij-4.png

|好啦,这样就搭建好了基本spring 的maven项目啦,接下来进入正题 |

jdbc总结

开发步骤

  • 注册驱动
  • 获得连接
  • 获得语句执行平台
  • 执行sql语句
  • 处理结果
  • 释放资源

API总结

java.sql.DriverManager用来装载驱动程序,获取数据库连接。
java.sql.Connection完成对某一指定数据库的联接
java.sql.Statement在一个给定的连接中作为SQL执行声明的容器,他包含了两个重要的子类型。
Java.sql.PreparedSatement 用于执行预编译的sql声明
Java.sql.CallableStatement用于执行数据库中存储过程的调用
java.sql.ResultSet对于给定声明取得结果的途径

命令学习整理

初学mysql

  • mysql -h 主机地址 -u 用户名 -p密码 登录mysql
  • exit 退出mysql
  • mysqladmin -u用户名 -p旧密码 password 新密码 修改密码
  • grant select on 数据库.* to 用户名@登录主机 identified by “密码” 增加新用户
  • show databases; 显示所有数据库
  • use database_name; 选择数据库
  • CREATE DATABASE mydb; 创建数据库
  • DROP DATABASE mydb; 删除数据库
  • show tables; 显示数据库中表
  • describe 表名; 显示数据表结构
  • delete from 表名 将表清空
  • delete * from 表名 删除表中记录
例子:
drop database if exists school; //如果存在SCHOOL则删除   
create database school; //建立库SCHOOL   
use school; //打开库SCHOOL   
create table teacher //建立表TEACHER   
(   
id int(3) auto_increment not null primary key,   
name char(10) not null,   
address varchar(50) default '深圳',   
year date   
); //建表结束   
//以下为插入字段   
insert into teacher values('','glchengang','深圳一中','1976-10-10');   
insert into teacher values('','jack','深圳一中','1975-12-23');   
//修改表单
alter table 表单名
->add(
->添加项目
);

继续学习mysql

1、操作表
2、INSERT 插入字段

格式:insert into 表名(要插入的列) value();注意对应关系;

3、select 选择查询

格式:select * from 表名;

4、update 更新字段

格式:update 表名 set 字段=”值” where 条件

5、delete

格式:delete 表名 [where条件];

6、DCL 用户操作

(1)创建用户:

create user 用户名@IP地址 identified by 密码;//用户只能在一个ip上登录地址

create user 用户名@”%” identified by 密码;//用户只能在任何ip上登录地址

(2)给用户授权:

超级用户登录,然后:

GRANT ALL ON 数据库.* to 用户名@IP地址

(3)撤销用户权限:

超级用户登录,然后:

REVOKE ALL ON 数据库.* from 用户名@IP地址

7、DQL 数据查询语言——不会对数据库进行修改

(1)、查询所有列:select * from 表名;

(2)、查询指定列:select 列1,列2,列3 from 表名;

(3)、完全重复的记录只一次:select distinct ;

(4)、列运算:数类型可加减乘除、字符串类型可concat连续运算;

(5)、条件查询:select 列1,列2,列3 from 表名 where [条件]

(6)、模糊查询:select 列 from 表名 where 列名 like “%”;

(7)、查询排序:select * from 表名 ORDER BY 列名(降序:DESC;升序:ASC);

(8)、聚合函数——纵向查询:select count(*) from 表名

规则:判断一行是否有null。。。。还有很多用的时候百度

(9)、分组查询:select 列名 count(*) from 表名 group by 列名;

7、limit(方言)——只在MySQL内

select * from 表名 limit 8,5(从第八行开始查询,要5行数据)

接着又学习mysql

1、约束之主键约束——可以简单理解为身份证id

格式:create datatbase (id int,name varchar(22),primary key(id)) values();

create datatbase (id int primary key ,name varchar(22)) values();

存在表时:alter table 表名 add primary key(id);

2、主键自增长

格式: create databae(id int primary key auto_increment,name varchar(22)) value();

存在表时:alter table 表名 add primary key(id) auto_increment;

3、非空约束和唯一约束

NOT NULL

4、外键关联

格式:create table 表名(id int )value();

XML实现简单学生管理系统

使用xml当作数据库,存储学生信息

// 增加
	public static void addStu(StudentDemo student) throws DocumentException, IOException {
		/*
		 * 1、创建解析器
		 * 2、获得document
		 * 3、获得根节点
		 * 4、在根节点上添加stu标签
		 * 5、在stu标签上依次添加id、name、age
		 * 6、在id、name、age上面依次添加值
		 * 7、回写xml
		 */
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/student.xml");
		Element root = document.getRootElement();
		
		Element stu = root.addElement("stu");
		Element id = stu.addElement("id");
		Element name = stu.addElement("name");
		Element age = stu.addElement("age");
		
		id.setText(student.getId());
		name.setText(student.getName());
		age.setText(student.getAge());
		
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/student.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
	}
//删除
	//根据student id删除
	
	public static void 	delStu(String id) throws DocumentException, IOException {
		/*
		 * 1、创建解析器
		 * 2、获得document
		 * 3、获得id  通过xpath
		 * 4、遍历list集合
		 * 5、判断list内id和传递的id是否相同
		 * 6、如果相同,把id所造stu删除
		 * 7、回写xml
		 */
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/student.xml");
		
		List<Node> list = document.selectNodes("//id");
		
		for (Node node : list) {
			String idv = node.getText();
			if(idv.equals(id)) {
				Element stu = node.getParent();
				Element student = stu.getParent();
				student.remove(stu);
			}
		}
		
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/student.xml"),format);
		xmlWriter.write(document);
		xmlWriter.close();
	}
//查询 更具id查询
	
	public static StudentDemo selectStu(String id) throws DocumentException {
		/*
		 * 1、创建解析器
		 * 2、获得document
		 * 3、获得所有id通过xpath
		 * 4、遍历list集合
		 * 5、判断list内id和传递的id是否相同
		 * 6、相同则找到父节点stu
		 * 7、得到stu的id,name,age值
		 */
		StudentDemo student = new StudentDemo();
		
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/student.xml");
		
		List<Node> list = document.selectNodes("//id");
		
		for (Node node : list) {
			String idv = node.getText();
			
			if(idv.equals(id)) {
				Element stu = node.getParent();
				String namev = stu.element("name").getText();
				String agev = stu.element("age").getText();
				student.setId(id);
				student.setName(namev);
				student.setAge(agev);
			}
			
		}
		
		return student;
	}

XML——dom4j

练习xml文本

<?xml version="1.0" encoding="UTF-8"?>
<person>
	<p1>
		<name>张三</name>
		<age>20</age>
	</p1>
	
	<p1>
		<name>李四</name>
		<age>30</age>
	</p1>
</person>

dom4j 查询name内的所有信息

  • 创建解析器
  • 得到document
  • 得到根节点 getRootElement()
  • 得到所有的p1的标签{element(qname)//表示标签下第一个子标签,elements(qname)//获取标签下面的所有子标签(一层}
  • 得到name
  • 得到name里面的值
public static void selectName() throws DocumentException {
		/*
		 * 1、创建解析器
		 * 2、得到document
		 * 3、得到根节点
		 * 4、得到p1
		 * 5、得到p1下面的name
		 * 6、得到name里面的值
		 */
		
		SAXReader saxReader = new SAXReader();
		
		Document document = saxReader.read("src/Student.xml");
		
		Element root = document.getRootElement();
		
		List<Element> p1 = root.elements("p1");
		
		for (Element element : p1) {
			Element name1 = element.element("name");
			String s = name1.getText();
			System.out.println(s);
		}
	}

dom4j实现末尾添加操作

/*添加性别条目*/

  • 创建解析器
  • 得到document
  • 得到根节点
  • 获取到第一个p1
  • 在p1下边添加元素
  • 在添加完成之后的元素下面添加文本
  • 回写xml文件
public static void addSex() throws DocumentException, IOException {
		SAXReader saxReader = new SAXReader();
		
		Document document = saxReader.read("src/Student.xml");
		
		Element root = document.getRootElement();
		
		Element p1 = root.element("p1");
		//在p1下边儿直接创建一个元素
		
		Element sex1 = p1.addElement("sex");
		sex1.setText("nv");
		
		//回写xml
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/Student.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
		
	}

dom4j在特定位置添加元素

/*在第一个p1下面的age标签之前添加<school>uestc</school>*/

  • 创建解析器
  • 得到document
  • 得到根节点
  • 获取到第一个p1
  • 获得p1下面的所有元素
    • **elements()返回List;
    • List特定位置添加元素
    • add(int index, E element)
  • 回写xml
public static void addAgeBefore() throws DocumentException, IOException {
		SAXReader saxReader = new SAXReader();
		
		Document document = saxReader.read("src/Student.xml");
		
		Element root = document.getRootElement();
		
		Element p1 = root.element("p1");
		
		List<Element> list = p1.elements();
		
		Element school = DocumentHelper.createElement("school");
		school.setText("UESTC");
		list.add(1,school);
		//这些操作都在内存中操作的,所以接下来回写xml
		
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/Student.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
	}

dom4j实现修改操作

/*修改p1下age的值为60*/

  • 创建解析器
  • 得到document
  • 得到根节点
  • 获取到第一个p1下的age
  • 修改值为60
  • 回写xml
public static void modify() throws DocumentException, IOException {
		SAXReader saxReader = new SAXReader();
		
		Document document = saxReader.read("src/Student.xml");
		
		Element root = document.getRootElement();
		
		Element p1 = root.element("p1");
		
		Element age = p1.element("age");
		
		age.setText("60");
		
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/Student.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
	}

dom4j删除节点操作——通过父节点删除

/*删除学校*/

  • 创建解析器
  • 得到document
  • 得到根节点
  • 得到p1标签
  • 得到p1下面的school元素
  • 删除
  • 回写xml
public static void delet() throws DocumentException, IOException {
		SAXReader saxReader = new SAXReader();
		
		Document document = saxReader.read("src/Student.xml");
		
		Element root = document.getRootElement();
		
		Element p1 = root.element("p1");
		
		Element school = p1.element("school");
		//通过父节点删除
		
		//school.getParent();
		p1.remove(school);

		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/Student.xml"), format);
		xmlWriter.write(document);
		xmlWriter.close();
	}

Jsp学习整理

一、Jsp对象

1、out对象——jspWriter类的实例,向客户端输出内容常用对象

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>out对象的使用</h1>
	<%
		out.println("静夜诗<br>");
		out.println("窗前明月光,<br>");
		out.println("疑是地上霜。<br>");
		out.println("举头望明月,<br>");
		out.println("低头思故乡。<br>");
	%>
	缓冲区大小:<%=out.getBufferSize() %>byte<br>
	缓冲区剩余大小:<%=out.getRemaining() %>byte<br>
	是否自动清空缓冲区:<%=out.isAutoFlush() %><br>
</body>
</html>
out其他常用对象

void println(); //向客户端打印字符串

void clear(); //清楚缓冲区内容,如果在flush后出现抛异常

void clearBuffer(); //清楚缓冲区内容,如果在flush之后不会抛异常

void flush(); //将缓冲区内容输出到客户端

int getBufferSize(); //返回缓冲区大小,如果不设置是为0

int getRemaining(); //返回剩余缓冲区大小

boolean isAutoFlush(); //返回缓冲区满时是自动清空,还是抛出异常

void close(); //关闭输出流

2、get和post区别

<form name = "regForm" action = "action" method="get/post">
</form>

get:以明文提交方式,速度快,传输不超过2k,适合提交数据量不大、安全系数不高的数据,比如:搜索、查询;

post:将用户提交的信息封装到HTML HEADER内。适合提交数据量大、安全性高的用户信息。比如:注册、修改、上传等功能。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>用户登录</h1>
	<hr>
		<form action = "dologin.jsp" name="logForm" method = "post">
			<table>
				<tr>
					<td>用户名:</td>
					<td><input type = "text" name="username"/></td>
					</tr>
				
				<tr>
					<td>密码:</td>
					<td>
						<input type="password" name = "password"/>
					</td>
				</tr>
				<td colspan="1"><input type="submit" value="登录"></td>
			</table>
		</form>
	</hr>
</body>
</html>

3、request对象

客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是httpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。

String getParameter(String name) 返回name指定参数的参数值

String[] getParameterValues(String name) 返回含参数name的所有值的数组

void setAttribute(String,Object);存储此请求中的属性

object getAttribute(String name);返回指定属性的值

String getContentType()得到请求体的MIME 类型

String getProtocol() 返回请求的协议类型及版本号

String getServerName() 返回接受请求的服务器主机名

3、response对象

4、Session对象

简单来说就是打开浏览器,到关闭的时间,这样一个特殊的时间段叫做session

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session</title>
</head>
<body>
	<h1>session Study</h1>
	<hr>
	<%
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
		Date d = new Date(session.getCreationTime());
		session.setAttribute("username", "admin");
	%>
	Session创建时间:<%=sdf.format(d) %><br>
	Session的ID编号:<%=session.getId() %><br>
	从Session中获取用户名:<%=session.getAttribute("username")%><br>
	
</body>
</html>

数据表与简单java类的映射转换

基本操作:先抛开所有的关联字段,建立基本类,再引用关联表示关联关系

一对多映射

按照表的要求将表的结构转换为类的结构,同时获得如下信息:

  • 获取一个分类的信息
  • 可以根据分类获取对应的所有子分类的信息

package dataExcl;
class Item{
    private long iid;
    private String title;
    private Subitem subitems[];

    public Item(long iid, String title) {
        this.iid = iid;
        this.title = title;
    }

    public long getIid() {
        return iid;
    }

    public void setIid(long iid) {
        this.iid = iid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Subitem[] getSubitems() {
        return subitems;
    }

    public void setSubitems(Subitem[] subitems) {
        this.subitems = subitems;
    }

    public String getInfo(){
        return "分类信息:iid:"+this.iid+" title:"+this.title;
    }
}

class Subitem{
    private long sid ;
    private String title ;
    private Item items;

    public Subitem(long sid, String title) {
        this.sid = sid;
        this.title = title;
    }

    public long getSid() {
        return sid;
    }

    public void setSid(long sid) {
        this.sid = sid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Item getItems() {
        return items;
    }

    public void setItems(Item items) {
        this.items = items;
    }
        public String getInfo(){
            return "子分类信息:sid:"+this.sid+" title:"+this.title;
        }
}
public class JavaDemo {
    public static void main(String[] args) {
        //第一步:根据结构设置对象
        Item item = new Item(1L,"图书");
        Subitem subitem [] = new Subitem[]{
                new Subitem(10L,"编程图书"),
                new Subitem(10L,"图形图书")
        };
        item.setSubitems(subitem);
        for(int i=0;i<subitem.length;i++){
            subitem[i].setItems(item);
        }
        //第二部:根据要求获取数据
        System.out.println(item.getInfo());
        for(int i=0;i<subitem.length;i++){
            System.out.println(subitem[i].getInfo());
        }
    }
}
package dataExcl;
class Item{
    private long iid;
    private String title;
    private Subitem subitems[];

    public Item(long iid, String title) {
        this.iid = iid;
        this.title = title;
    }

    public long getIid() {
        return iid;
    }

    public void setIid(long iid) {
        this.iid = iid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Subitem[] getSubitems() {
        return subitems;
    }

    public void setSubitems(Subitem[] subitems) {
        this.subitems = subitems;
    }
}

class Subitem{
    private long sid ;
    private String title ;
    private Item items;

    public Subitem(long sid, String title) {
        this.sid = sid;
        this.title = title;
    }

    public long getSid() {
        return sid;
    }

    public void setSid(long sid) {
        this.sid = sid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Item getItems() {
        return items;
    }

    public void setItems(Item items) {
        this.items = items;
    }
}
public class JavaDemo {
    public static void main(String[] args) {
        //第一步:根据结构设置对象
        Item item = new Item(1L,"图书");
        Subitem subitem [] = new Subitem[]{
                new Subitem(10L,"编程图书"),
                new Subitem(10L,"图形图书")
        };
        item.setSubitems(subitem);
        for(int i=0;i<subitem.length;i++){
            System.out.println(subitem[i].getSid()+subitem[i].getTitle());
        }
        //第二部:根据要求获取数据

    }
}

多对多关系映射

将以上结构转换为类结构:

  • 获取一个用户访问的所有的商品信息
  • 获取一个商品被浏览过的所有信息

package dataExcl;
class User{
private long uid;
private String uname;
private Product product[];

public User(long uid, String uname) {
this.uid = uid;
this.uname = uname;
}

public Product[] getProduct() {
return product;
}

public void setProduct(Product[] product) {
this.product = product;
}

public String getInfo(){
return "[用户信息] 用户id:"+this.uid+"、用户id:"+this.uname;
}
}
class Product{
private long pnum;
private String pname;
private double price;
private User user[];

public Product(long pnum, String pname, double price) {
this.pnum = pnum;
this.pname = pname;
this.price = price;
}

public String getInfo(){
return "[商品信息] 商品编号:"+this.pnum+"、商品名称:"+this.pname+"、商品价格"+this.price;
}

public User[] getUser() {
return user;
}

public void setUser(User[] user) {
this.user = user;
}
}

public class JavaDemo {
public static void main(String[] args) {
//第一步:根据结构设置对象
User userA = new User(1L,"张三");
User userB = new User(2L,"李四");
User userC = new User(3L,"王五");

Product productA = new Product(1,"耳机",378.5);
Product productB = new Product(2,"电脑",6300.5);
Product productC = new Product(3,"音响",400);

userA.setProduct(new Product[]{productA,productB,productC});
userB.setProduct(new Product[]{productA,productB});
userC.setProduct(new Product[]{productA});

productA.setUser(new User[]{userA,userB,userC});
productB.setUser(new User[]{userA,userB});
productC.setUser(new User[]{userA});
//第二步:根据要求获取数据

System.out.println("------------------------根据用户查询访问信息----------------------------------");
System.out.println(userA.getInfo());
for (int i=0;i<userA.getProduct().length;i++){
System.out.println(userA.getProduct()[i].getInfo());
}
}
}