一个使用JavaBeans实现访问计数器的JSP应用

合集下载

bean使用方法

bean使用方法

bean使用方法Bean是Java中重要的概念之一,它是一种可重复使用的软件组件,具有独立性和可插拔性。

在Java开发中,Bean通常用于封装数据和业务逻辑,使得代码更加模块化、可维护和可扩展。

本文将介绍Bean的使用方法,包括创建Bean、设置属性和使用Bean的实例等。

一、创建Bean在Java中,创建Bean有多种方式,最常见的是使用类来定义Bean。

首先,我们需要创建一个类,该类可以包含属性和方法。

然后,我们可以使用该类来创建Bean的实例。

例如,我们可以创建一个名为Person的类,并定义属性name和age:public class Person {private String name;private int age;// 构造方法public Person(String name, int age) { = name;this.age = age;}// getter和setter方法public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}二、设置属性创建Bean的实例后,我们可以使用setter方法来设置Bean的属性。

setter方法通常具有以下形式:setXxx(),其中Xxx是属性的名称。

例如,我们可以使用以下代码设置Person的属性:Person person = new Person();person.setName("张三");person.setAge(20);三、使用Bean的实例创建并设置Bean的属性后,我们可以使用Bean的实例来调用其方法。

例如,我们可以使用以下代码获取并输出Person的属性:System.out.println("姓名:" + person.getName());System.out.println("年龄:" + person.getAge());四、使用Bean的注意事项在使用Bean时,需要注意以下几点:1. Bean的属性应该具有合适的访问修饰符,一般为private,以保证数据的封装性。

JSP作业(二)

JSP作业(二)

JSP作业4-2编写一个实现页面计数的计数器,要求当刷新页面时,不增加计数。

程序代码<%@ page contentType="text/html;charset=gb2312"%><%!int num=0;synchronized void add(){num++;}%><html><head><title>计数器</title></head><body><%if(session.isNew())add();%><center>您是第<%=num%>位访问该页的游客!</center></body></html>截图4-3编写一个简易购物车,实现向购物车内添加商品,移除指定商品及清空购物车功能。

程序代码<%@ page contentType="text/html;charset=gb2312"%><%@ page import="java.util.ArrayList"%><%!int m=0;int Id=8888;ArrayList<String> goodslist = new ArrayList<String>();ArrayList<Float> pgoodslist = new ArrayList<Float>();ArrayList<String> buylist=new ArrayList<String>();ArrayList<Float> pbuylist=new ArrayList<Float>();ArrayList<Integer> nbuylist=new ArrayList<Integer>();%><%float total=0; %><%if(Id==8888){goodslist.add(0,"荔枝");goodslist.add(1,"火龙果");goodslist.add(2,"西瓜");goodslist.add(3,"柚子");pgoodslist.add(0,8.8f);pgoodslist.add(1,9.6f);pgoodslist.add(2,5.2f);pgoodslist.add(3,4.8f);}%><%session.setAttribute("goodslist",goodslist);session.setAttribute("pgoodslist",pgoodslist);%><table border="1" width="450" rules="none" cellspacing="0" cellpadding="0"><tr height="50"><td colspan="3" align="center">提供商品如下</td></tr><td>名称</td><td>价格(元/斤)</td><td>购买</td><%session.getAttribute("goodslist");session.getAttribute("pgoodslist"); %><%if(goodslist==null||goodslist.size()==0){%><tr height="100"><td colspan="3" align="center">没有商品可以显示</td></tr><%}else{for(int m=0;m<goodslist.size();m++){%><tr height="50" align="center"><td><%=goodslist.get(m) %></td><td><%=pgoodslist.get(m) %></td><td><a href="index.jsp?id=<%=m+1%>">购买</a></td></tr><% }}%></table>********************************************************************* *****<table border="1" width="450" rules="none" cellspacing="0" cellpadding="0"><tr align="center" height="30" bgcolor="lightgrey"><td>名称</td><td>价格</td><td>数量</td><td>总价</td><td>移除</td></tr><%String str=request.getParameter("id");if(str==null||str.equals(""))str="0";try{Id=Integer.parseInt(str);}catch(NumberFormatException e){Id=0;e.printStackTrace();}%><%if(Id==1){if(buylist.size()==0){buylist.add(0,goodslist.get(0));pbuylist.add(0,pgoodslist.get(0));nbuylist.add(0,1);}else{int k=0;for(;k<buylist.size();k++){if(buylist.get(k).equals(goodslist.get(0))){int w=nbuylist.get(k);nbuylist.set(k,w+1);break;}}if(k>=buylist.size()){buylist.add(k,goodslist.get(0));pbuylist.add(k,pgoodslist.get(0));nbuylist.add(k,1);}}}if(Id==2){if(buylist.size()==0){buylist.add(0,goodslist.get(1));pbuylist.add(0,pgoodslist.get(1));nbuylist.add(0,1);}else{int k=0;for(;k<buylist.size();k++){if(buylist.get(k).equals(goodslist.get(1))){int w=nbuylist.get(k);nbuylist.set(k,w+1);break;}}if(k>=buylist.size()){buylist.add(k,goodslist.get(1));pbuylist.add(k,pgoodslist.get(1));nbuylist.add(k,1);}}}if(Id==3){if(buylist.size()==0){buylist.add(0,goodslist.get(2));pbuylist.add(0,pgoodslist.get(2));nbuylist.add(0,1);}else{int k=0;for(;k<buylist.size();k++){if(buylist.get(k)==goodslist.get(2)){int w=nbuylist.get(k);nbuylist.set(k,w+1);break;}}if(k>=buylist.size()){buylist.add(k,goodslist.get(2));pbuylist.add(k,pgoodslist.get(2));nbuylist.add(k,1);}}}if(Id==4){if(buylist.size()==0){buylist.add(0,goodslist.get(3));pbuylist.add(0,pgoodslist.get(3));nbuylist.add(0,1);}else{int k=0;for(;k<buylist.size();k++){if(buylist.get(k)==goodslist.get(3)){int w=nbuylist.get(k);nbuylist.set(k,w+1);break;}}if(k>=buylist.size()){buylist.add(k,goodslist.get(3));pbuylist.add(k,pgoodslist.get(3));nbuylist.add(k,1);}}}if(Id==10){if(nbuylist.get(0)>1){int h=nbuylist.get(0);nbuylist.set(0,h-1);}else if(nbuylist.get(0)==1){buylist.remove(0);pbuylist.remove(0);nbuylist.remove(0);}}if(Id==20){if(nbuylist.get(1)>1){int h=nbuylist.get(1);nbuylist.set(1,h-1);}else if(nbuylist.get(1)==1){buylist.remove(1);pbuylist.remove(1);nbuylist.remove(1);}}if(Id==30){if(nbuylist.get(2)>1){int h=nbuylist.get(2);nbuylist.set(2,h-1);}else if(nbuylist.get(2)==1){buylist.remove(2);pbuylist.remove(2);nbuylist.remove(2);}}if(Id==40){if(nbuylist.get(3)>1){int h=nbuylist.get(3);nbuylist.set(3,h-1);}else if(nbuylist.get(3)==1){buylist.remove(3);pbuylist.remove(3);nbuylist.remove(3);}}if(Id==888888){buylist.clear();pbuylist.clear();nbuylist.clear();total=0;}if(buylist==null||buylist.size()==0){%><tr height="100"><td colspan="5" align="center">您的购物车为空</td></tr> <%}else{for(int l=0;l<buylist.size();l++){String name=buylist.get(l);float price=(float)pbuylist.get(l);int num=(int)nbuylist.get(l);float money=((int)((price*num+0.05f)*10))/10f;total+=money;%><tr align="center" height="50"><td><%=name %></td><td><%=price %></td><td><%=num %></td><td><%=money %></td><td><a href="index.jsp?id=<%=((l+1)*10 )%>">移除</a></td></tr><% }}%><tr height="50" align="center"><td colspan="5">应付金额:<%=total %></td></tr><tr height="50" align="center"><td colspan="3"><a href="index.jsp?id=888888">清空购物车</a></td></tr></table>截图5-3实现一个简单的登录程序。

实验2 基于JSP+JavaBean模式的应用实例

实验2 基于JSP+JavaBean模式的应用实例

实验2:基于JSP+JavaBean模式的应用实例实验内容:数据库访问操作通过JavaBean进行封装完成用户登录操作实验目的:1、掌握JavaBean的编写方法2、熟练掌握JSP与JavaBean访问相关标记的使用实验要求:1、使用MySQL数据库完成数据库表的设计2、使用Dreamweaver完成用户表单的设计3、编写数据访问JavaBean文件4、使用JSP技术调用JavaBean组件完成用户登录的相关操作实验步骤:1、使用MySQL数据库完成数据库表的设计创建数据库usermanager,并创建数据表users,包括用户名和密码两个字段,具体表结构如表2-1所示。

表2-1 用户信息表字段名数据类型长度是否为空是否主键描述username varchar 20 否是用户名password varchar 20 否否密码2、使用Dreamweaver完成表单的设计(1)使用Dreamweaver创建用户表单login.jsp,包括用户名和密码两个文本框、提交及重置两个按钮,具体如图2-1所示。

图2-1 用户登录页面(2)创建用户登录成功页面success.jsp(如图2-2所示)以及用户登录失败页面fail.jsp(如图2-3所示)。

图2-2 用户登录成功页面图2-3 用户登录失败页面3、编写数据访问JavaBean组件将数据访问操作封装到JavaBean文件DataBaseManager.java中,具体包括以下方法:(1)public static Connection getConnection():获取数据库连接。

(2)public ResultSet doQuery(String strSQL):执行查询操作。

(3)public int doUpdate(String strSQL):执行增加、删除和修改操作。

(4)public void closeConnection():关闭数据连接。

java 程序计数器 工作原理

java 程序计数器 工作原理

java 程序计数器工作原理
Java程序计数器(Program Counter Register)是一种特殊的寄
存器,用于存储当前线程正在执行的Java虚拟机指令的地址。

它在Java虚拟机的多线程环境中扮演着关键的角色。

Java程序计数器的工作原理与指针类似。

它指向当前线程执行的字节码指令。

随着指令的执行,计数器的值不断地更新。

当线程调用方法时,程序计数器会保存当前指令的地址,当方法执行返回时,会将该地址取出,恢复线程继续执行。

Java程序计数器的作用在于它能够确保线程之间的独立性。

由于Java虚拟机通过多线程的方式执行Java程序,每个线程都
需要有自己的程序计数器,以确保各线程之间的指令不会互相干扰。

此外,Java程序计数器还具有异常处理的作用。

在处理异常时,程序计数器会记录下异常被抛出的位置信息,以便确定跳转到合适的异常处理器中。

总之,Java程序计数器是Java虚拟机的重要组成部分,能够
确保线程之间的独立性和异常处理的准确性。

java计数器的用法

java计数器的用法

java计数器的用法Java计数器是Java中一种用于计数的特殊工具。

它可以帮助我们在程序中记录和操作数字以及检测数据的变化情况。

本文将介绍计数器的用法以及如何在Java中使用计数器完成一些常见的任务。

一、计数器的用途Java计数器用于在程序中统计和记录数据。

我们可以使用计数器来记录用户在应用程序中的点击次数,记录在某个环节出现的错误次数,或者统计某个任务执行的时间等。

在需要持续追踪一些数据的情况下,计数器是非常有用的工具。

二、Java计数器的类型Java计数器通常分为两种类型:AtomicInteger和 LongAdder.1. AtomicInteger:AtomicInteger是专门为高并发场景设计的一种计数器,它采用CAS(比较并交换)实现原子性操作。

AtomicInteger通常用于在多线程环境下对某个变量的增减操作,可以保证在多个线程中对该变量的操作是原子性的,即同一时刻只有一个线程可以修改这个变量。

例如,在同时访问一个变量的情况下,多线程不会发生竞争问题,进行操作时保证线程安全。

2. LongAdder:LongAdder主要是为了解决高并发情况下,多线程对数据增减操作发生冲突的问题。

对于AtomicInteger来说,一旦出现竞争情况,就会发生高争用,导致性能瓶颈。

而LongAdder则引入了“分段锁”的概念,将不同线程对同一个变量的操作分离出来,然后将这些操作分散到不同的“工作单元”中,最后将所有的工作单元的计数结果汇总。

三、Java计数器的使用下面以AtomicInteger为例来介绍Java计数器的使用:1. 初始化计数器AtomicInteger count = new AtomicInteger(0);2. 计数器自增count.incrementAndGet();3. 计数器自减count.decrementAndGet();4. 获取计数器的值count.get();四、Java计数器的应用1. 统计页面点击次数private AtomicInteger count = new AtomicInteger(0);public void click() {count.incrementAndGet();}2. 记录日志private AtomicInteger errorCount = new AtomicInteger(0);public void doSomething() {try {//do something...} catch (Exception e) {errorCount.incrementAndGet();//记录日志}}3. 计算任务执行时间private AtomicInteger taskCount = new AtomicInteger(0); private AtomicLong totalTime = new AtomicLong(0);public void doTask() {long startTime = System.currentTimeMillis();//do something...long endTime = System.currentTimeMillis();int count = taskCount.incrementAndGet();totalTime.addAndGet(endTime - startTime);System.out.println("任务执行时间:" + (endTime - startTime) + "ms");System.out.println("任务执行次数:" + count);System.out.println("平均执行时间:" + totalTime.get() / count + "ms");}综上所述,Java计数器是一种非常有用的工具,可以帮助我们追踪数据的变化以及完成某些任务。

usebean的用法

usebean的用法

usebean的用法一、概述usebean是JSP中的一个标签,主要用于在JSP页面中创建JavaBean对象,并将其作为一个变量存储在page、request或session范围内,以便在后续的代码中使用。

二、语法usebean标签的语法如下:<jsp:useBean id="beanName" class="className"scope="scopeName"/>其中,id属性用于指定JavaBean对象的名称,class属性用于指定JavaBean对象所属的类名,scope属性用于指定JavaBean对象存储的范围。

三、使用方法1. 创建JavaBean类首先需要创建一个JavaBean类,该类需要包含一些成员变量和对应的getter和setter方法。

例如:public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}2. 在JSP页面中使用usebean标签创建JavaBean对象在JSP页面中使用usebean标签创建JavaBean对象,并将其存储在page、request或session范围内。

例如:<jsp:useBean id="user" class="er"scope="session"/>3. 使用EL表达式访问JavaBean对象通过EL表达式可以方便地访问存储在page、request或session范围内的JavaBean对象。

jsp试题库及答案

jsp试题库及答案

jsp试题库及答案JSP试题库及答案一、选择题1. JSP技术使用的是哪种语言作为其脚本语言?A. JavaB. JavaScriptC. C#D. Python答案:A2. 在JSP页面中,哪一个指令用于指定信息处理类?A. <%@ page %>B. <%@ include %>C. <%@ taglib %>D. <%@ attribute %>答案:A3. 如果要在JSP页面中包含另一个JSP页面,应该使用哪个JSP元素?A. <jsp:include>B. <jsp:forward>C. <jsp:param>D. <jsp:useBean>答案:A4. JSP页面的默认脚本语言是什么?A. HTMLB. JavaScriptC. JavaD. SQL答案:C5. 在JSP中,使用什么标签可以将Java Bean组件的属性传递给表达式语言(EL)?A. <jsp:useBean>B. <jsp:setProperty>C. <jsp:getProperty>D. <jsp:forward>答案:C二、简答题1. 请简述JSP和Servlet的区别。

答案:JSP(JavaServer Pages)是一种用于生成动态网页的技术,它使用模板和Java代码的混合来实现页面内容的动态生成。

Servlet是一种运行在服务器端的Java小程序,可以处理客户端请求并生成响应。

JSP最终被编译成Servlet,由Servlet容器执行。

JSP主要用于页面内容的生成,而Servlet则可以处理更复杂的业务逻辑。

2. 描述一下JSP的动作元素和标准动作元素的区别。

答案:JSP的动作元素(Action Element)用于控制Servlet引擎的行为,例如包含其他页面、转发请求等。

(完整word版)JSP实用教程_复习题《Web开发技术》复习题

(完整word版)JSP实用教程_复习题《Web开发技术》复习题

《Web开发技术》复习题一、选择题1、在传统的HTML页面中加入( D)就构成了一个JSP页面文件。

A、JAVA程序片B、JSP标签C、用“<%"、“%〉"标记符号括起来的程序D、JAVA程序片和JSP标签2、配置JSP运行环境,若WEB应用服务器选用TOMCAT,以下说法正确的是:(B)A、先安装TOMCAT,再安装JDKB、先安装JDK,再安装TOMCATC、不需安装JDK,安装TOMCAT就可以了D、JDK和TOMCAT只要都安装就可以了,安装顺序没关系3、对于“〈%!”、“%>”之间声明的变量,以下说法正确的是:(B)A、不是JSP页面的成员变量B、多个用户同时访问该页面时,任何一个用户对这些变量的操作,都会影响到其他用户C、多个用户同时访问该页面时,每个用户对这些变量的操作都是互相独立的,不会互相影响D、是JSP页面的局部变量4、在客户端浏览器的源代码中可以看到(B)A、JSP注释B、HTML注释C、JSP注释和HTML注释D、JAVA注释5、page指令的作用是:(A )A、用来定义整个JSP页面的一些属性和这些属性的值B、用来在JSP页面内某处嵌入一个文件C、使该JSP页面动态包含一个文件D、指示JSP页面加载Java plugin6、page指令的import属性的作用是(C )A、定义JSP页面响应的MIME类型B、定义JSP页面使用的脚本语言C、为JSP页面引入JAVA包中的类D、定义JSP页面字符的编码7、page指令的(C )属性可以设置JSP页面是否可多线程访问A、sessionB、bufferC、isThreadSafeD、info8、(C )可在JSP页面出现该指令的位置处,静态插入一个文件.A、page指令标签B、page指令的import属性C、include指令标签D、include动作标签9、以下对象中的( D )不是JSP的内置对象。

bean的用法

bean的用法

bean的用法一、简介Bean是Java编程语言中的一个基础类,通常用于封装程序中的数据和功能。

它是一个可重用的对象,可以在程序中创建多个实例。

通过使用Bean,我们可以将相关的数据和方法组织在一起,从而提高代码的可读性和可维护性。

二、基本用法1. 定义Bean:使用Java的类定义语法来创建Bean。

通常,我们会将数据成员和方法成员定义为私有变量和公共getter/setter方法。

```javapublic class MyBean {private String name;private int age;public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}```2. 创建Bean实例:使用new关键字在程序中创建Bean实例。

```javaMyBean bean = new MyBean();```3. 访问Bean数据:通过公共getter方法访问Bean中的数据。

```javaString name = bean.getName();int age = bean.getAge();```4. 设置Bean数据:通过公共setter方法设置Bean中的数据。

```javabean.setName("John");bean.setAge(30);```5. 共享Bean实例:如果多个类需要使用同一个Bean实例,可以将该Bean 定义为公共类成员变量,并在需要时通过该变量访问其数据和方法。

```javapublic class OtherClass {private MyBean myBean;...// 在其他类中通过myBean访问MyBean的数据和方法}```三、注意事项1. Bean的作用域:Bean可以有不同的作用域,如实例作用域、静态作用域等。

构建网站软件组合系列讲解——用JSP+Apache+Tomcat+JavaBeans+Servlet+Oracle8i+Solaris7构建网站

构建网站软件组合系列讲解——用JSP+Apache+Tomcat+JavaBeans+Servlet+Oracle8i+Solaris7构建网站
谷和 启
概 述
1 JP简 介 S
马丽 萍
记 ,还可接受第三方开发的标记 ,从而可以方便使用第三方提


供的功能组件
2 S .JP的 开 发 运 行 环境
JP JvSre P gs 是 由 S nMi oyl s 司倡导 、许 S ( aevr ae) a u c ss m 公 r e 多公司参与一起建立的一种动态阿页技术标 准 该技术为创建 显示 动 态生成 内容的 We b页 面提供 了 一个简 捷 而快 速 的方 法 JP技术 的设计 目的是使得构造基于 We S b的应 用程序更加 容易 和快捷 .而这 些应用程序能 够与各种 We b服 务器 应用
能 ,是一 个实现 JP非 常好的软件 ,使用的人也最多 .一般我 S 们都 以此 为准 。
● T m a:又一 个 很 多 人 使 用 的 JP引擎 。 o ct S
1可穆植性 : Jv e t ) aas k 程序 则具有 Jv aa程序 的优 点,
可运行在任何平 台之上 ,大多数 We b及应用服务器都支持 J- a
● 组 件 的重用
光 是 J P引擎 ,同时还可 作 We S b服务器 ,还有 I I P s和 WS结
台 了 JL R N也能支持 JP服务 。 S Wel i:一 个功能十分强大 的服 务器软 件 ,配置 比较简 bg oc 单 ,对 JP的扩展十分强大 ,附带数据库 J B S D C驱动程序 ,支 持 J T L,是 目前市 场 占有率最高的服务器 。 HM
维普资讯
实用第一
智慧密集
构 建 网 站 软 件 组 合 系 列 讲 解
用 JP+ pce T m a + aa en +Srl +O al8 + o r S A ah + o ct JvB a s e e v t r ei Sl i7构建 网站 c as

JSP。JavaBean实例---四则运算bean

JSP。JavaBean实例---四则运算bean

JSP。

JavaBean实例---四则运算beanJSP JavaBean实例——四则运算BeanXXX是一种可重用的组件,我们可以在不同的程序中调用它来完成一定的逻辑功能。

现在,我们将创建一个案例,演示JavaBean的创建和调用。

该案例实现求取两个数的和、差、积和商等,包括一个JavaBean和两个JSP文件。

首先,我们需要创建JavaBean文件。

打开记事本,输入以下代码:package test;public class SiExample{private double num1;private double num2;public void setNum1(double num1){this.num1=num1;public void setNum2(double num2){ this.num2=num2;public double getNum1(){return num1;public double getNum2(){return num2;public double add(){double num3=num1+num2;return num3;public double jian(){double num3=num1-num2;return num3;public double cheng(){double num3=num1*num2;return num3;public double chu(){double num3=num1/num2;return num3;将上述代码保存,名称为SiExample.java。

在该文件中,我们创建了两个私有变量num1和num2,用来接收外部传递的参数。

接下来创建了set和get方法组,实现对变量num1和num2的赋值和获取。

最后创建了四个方法add()、jian()、cheng()和chu(),用来求取两个数的和、差、积和商。

接下来,我们需要创建客户输入页面。

JavaBeans的介绍与使用

JavaBeans的介绍与使用

JavaBeans的介绍与使⽤简介Javabeans就是符合某种特定的规范的Java类。

使⽤Javabeans的好处是解决代码重复编写,功能区分明确,提⾼了代码的可维护性。

就是⼀个普通的java类,但符合某种特定规范。

遵循某种设计原则就是常见的实体类感觉例⼦:JSP动作 JSP动作元素为请求处理阶段提供信息。

动作元素遵循XML元素的语法,有⼀个包含元素名的开始标签,可以有属性,可选内容,与开始标签匹配的结束标签。

包含以下⼏类,第⼀类的三个标签,重点!<jsp:userBean><jsp:setProperty><jsp:getProperty>javabeans通常在jsp页⾯中使⽤。

两种⽅式使⽤javabeans第⼀种⽅式在src⽬录中创建好javabeans类后,然后在jsp页⾯中,导⼊类<%@ page import=“User类所在的包名”%>导⼊包后,在html标签中加⼊以下:和普通的创建⼀个java类没有任何区别。

第⼆种创建javabeans⽅法 在JSP页⾯中通常使⽤JSP动作标签来使⽤javabeanuseBeans动作setProperty动作getProperty动作<jsp:useBeans>作⽤:在jsp页⾯中实例化或者在指定范围内使⽤javabean<jsp:useBean id=" " class="java类名" scope=”作⽤范围“ />这样就不需要导⼊包,然后创建对应的实例对象,⽽是直接向下⾯这样使⽤运⾏后,因为我们没有初始化,所以都为null那么怎么初始化呢,使⽤setProperty<jsp:setProperty>作⽤:给已经实例化的Javabean对象的属性赋值,⼀共有四种形式。

第⼀种⽅式,根据表单匹配所有属性这⾥的name就是javabeans的id,⽤*号是根据表单来进⾏匹配的也就是说⽤户当时填写表单的时候,⽐如填写的username栏为wu,那么就会⾃动对应到javabeans类中的username属性。

JAVAEE课件 第五章 在JSP页面中使用JavaBean(netbeans)(华北电力大学科技学院)

JAVAEE课件 第五章 在JSP页面中使用JavaBean(netbeans)(华北电力大学科技学院)

自动加入set/get方法 在代码编辑区右键重构封装字段
则netbeans自动为数据成员生成get/set方法
public static void main(String[] args) { package com.jsp; System.out.println("test JavaBean!"); public class Student { Student a=new Student(); private long classno; a.setAge(27); private String name; a.setClassno(1001); private int age; a.setName("mike"); private boolean sex; a.setSex(true); private String major; a.setMajor("computer"); public Student() { System.out.println("the name is "+a.getName()); System.out.println("the major is "+a.getMajor()); } if(a.isSex())System.out.println("it is male"); public String getName() { else System.out.println("it is female"); return name; }//手工添加main,以测试bean } 顶层包::Student public void setName(String name) { -classno:long = name; -name:String } -age:int -sex:boolean public int getAge() { return age; } -major:String public void setAge(int age) { this.age = age; } +Student()() public boolean isSex() { return sex; } //boolean变量的get函数是isXXX +setName()() +getName()() public void setSex(boolean sex) { this.sex = sex; } +setAge()() public String getMajor() { return major; } +getAge()() public void setMajor(String major) { this.major = major;} +isSex()() +setSex()() public long getClassno() { return classno; } +getMajor()() public void setClassno(long classno) { this.classno = classno; } +setMajor()()

java练习题

java练习题

Java练习题一、基本语法1. 编写一个Java程序,输出“Hello, World!”。

2. 声明一个整型变量并赋值为10,然后输出该变量的值。

3. 编写一个Java程序,实现两个整数的加、减、乘、除运算。

4. 声明一个浮点型变量并赋值为3.14,然后输出该变量的值。

5. 编写一个Java程序,判断一个整数是奇数还是偶数。

6. 使用三元运算符计算两个整数中的较大值。

7. 编写一个Java程序,实现字符串的拼接。

8. 声明一个布尔型变量并赋值为true,然后输出该变量的值。

9. 编写一个Java程序,输出1到100的所有偶数。

10. 使用for循环输出九九乘法表。

二、数组与字符串1. 声明一个整型数组并初始化,然后输出数组中的所有元素。

2. 编写一个Java程序,实现数组的逆序输出。

3. 计算一个整型数组的平均值。

4. 编写一个Java程序,查找数组中的最大值和最小值。

5. 使用冒泡排序算法对整型数组进行排序。

6. 编写一个Java程序,实现字符串的反转。

7. 判断一个字符串是否为回文。

8. 输出一个字符串中字母和数字的个数。

9. 编写一个Java程序,实现字符串的截取。

10. 使用StringBuilder类拼接一个由100个“Java”组成的字符串。

三、面向对象1. 定义一个学生类(Student),包含姓名、年龄和成绩属性,并实现一个打印学生信息的方法。

2. 编写一个Java程序,创建一个学生对象并设置其属性,然后调用打印学生信息的方法。

3. 定义一个矩形类(Rectangle),包含长和宽属性,并实现计算面积和周长的方法。

4. 编写一个Java程序,创建两个矩形对象,并比较它们的面积大小。

5. 定义一个动物类(Animal),包含吃、睡和叫的方法,然后创建一个狗类(Dog)继承动物类,并重写叫的方法。

6. 编写一个Java程序,演示多态性,创建一个动物数组,包含狗和猫对象,并调用它们的叫方法。

简述jsp的工作原理通俗

简述jsp的工作原理通俗

简述jsp的工作原理通俗JSP(Java Server Pages)是一种用于创建动态网页的技术,其工作原理可以简单概括为以下几个步骤:1. 客户端向服务器发送请求。

当用户在浏览器中访问一个包含JSP文件的网页时,客户端会向服务器发送请求,请求获取该网页的内容。

2. 服务器接收并解析JSP文件。

服务器接收到客户端的请求后,会找到对应的JSP文件并开始解析。

JSP文件本质上是一个HTML文件,其中包含一些用Java代码嵌入的特殊标记。

3. JSP编译为Java代码。

在解析JSP文件时,服务器会将其中的Java代码提取出来,并将其转换为一段Java程序。

4. Java代码编译为类文件。

服务器将这段Java程序编译为一个类文件,可以通过Java的编译器进行编译,得到可执行的代码。

5. 创建JSP的Servlet。

服务器会使用这个类文件创建一个Servlet实例,Servlet是JavaWeb中处理HTTP请求和响应的组件。

6. 服务器执行Servlet。

Servlet实例会使用Java代码处理请求,执行其中的逻辑操作。

例如,生成动态内容、访问数据库或调用其他Java类等。

7. 生成动态网页内容。

Servlet根据Java代码的逻辑生成动态的HTML内容,可以将其与静态的HTML代码进行结合。

8. 服务器将动态网页内容发送给客户端。

服务器将生成的HTML内容作为响应发送给客户端浏览器。

9. 浏览器渲染并显示网页。

最后,浏览器接收到服务器响应后,将动态生成的HTML内容解析和渲染,并以可视化的形式呈现给用户。

总结来说,JSP的工作原理是将JSP文件中嵌入的Java代码经过编译和执行,最终生成动态的HTML内容,并在服务器和客户端之间进行传输,最终呈现给用户。

这样,就能实现在网页上展示动态数据或执行动态操作的功能。

用java编写一个简易的计算器代码

用java编写一个简易的计算器代码

import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextField;/使用java 语言开发一个简易计算器/public class TestJsq extends JFrame implements ActionListener, KeyListener {private JTextField jtf;private JButton jb_bk, jb_ce, jb_c;private String xs = "";private double sum = 0;private int fh;public static void main(String[] args) {new TestJsq().creatCUI();}public void creatCUI() {JFrame jf = new JFrame();jf.setTitle("计算器");jtf = new JTextField("0.");jtf.setHorizontalAlignment(JTextField.RIGHT);jf.add(jtf, BorderLayout.NORTH);JPanel jp_main = new JPanel(new BorderLayout());jf.add(jp_main);JPanel jp1 = new JPanel(new GridLayout(1, 3, 1, 1));jb_bk = new JButton("Backspace");jb_bk.setForeground(Color.RED);jb_bk.addActionListener(this);jb_ce = new JButton("CE");jb_ce.setForeground(Color.RED);jb_ce.addActionListener(this);jb_c = new JButton("C");jb_c.setForeground(Color.RED);jb_c.addActionListener(this);jp1.add(jb_bk);jp1.add(jb_ce);jp1.add(jb_c);jp_main.add(jp1, BorderLayout.NORTH);JPanel jp2 = new JPanel(new GridLayout(4, 5, 1, 1));String str[] = { "7", "8", "9", "/", "sqrt", "4", "5", "6", "", "%","1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "=" };for (int i = 0; i < 20; i++) {JButton jb = new JButton(str[i]);jb.addActionListener(this);jb.setForeground(Color.blue);if (i == 3 || i == 8 || i == 13 || i == 18 || i == 19) { jb.setForeground(Color.RED);}jp2.add(jb);}jp_main.add(jp2, BorderLayout.CENTER);jf.setResizable(false);jf.setBounds(50, 50, 350, 350);jf.setVisible(true);}Overridepublic void actionPerformed(ActionEvent e) {String s = e.getActionCommand();if (s.equals("CE") || s.equals("C")) {xs = "";jtf.setText("0.");} else if (s.equals("Backspace")) {String str = xs.substring(0, xs.length() - 1);xs = str;jtf.setText(xs);} else if (s.equals("7") || s.equals("8") || s.equals("9") || s.equals("4") || s.equals("5") || s.equals("6")|| s.equals("1") || s.equals("2") || s.equals("3")|| s.equals("0") || s.equals(".")) {xs = xs + s;jtf.setText(xs);} else if (s.equals("+/-")) {double x = Double.parseDouble(xs);xs="" + (-x);jtf.setText(xs);} else if (s.equals("/")) {fh = 4;int point = xs.indexOf(".");if (point = -1) {String strt = xs.substring(0, point);String z = xs.substring(point + 1, xs.length());int z_num = z.length();sum = Integer.decode(strt) + (double) (Integer.decode(z))/ (10 z_num);} else {sum = Integer.decode(xs);}xs = "";jtf.setText(null);} else if (s.equals("")) {fh = 3;int point = xs.indexOf(".");if (point = -1) {String strt = xs.substring(0, point);String z = xs.substring(point + 1, xs.length());int z_num = z.length();sum = Integer.decode(strt) + (double) (Integer.decode(z))/ (10 z_num);} else {sum = Integer.decode(xs);}xs = "";jtf.setText(null);} else if (s.equals("-")) {fh = 2;int point = xs.indexOf(".");if (point = -1) {String strt = xs.substring(0, point);String z = xs.substring(point + 1, xs.length());int z_num = z.length();sum = Integer.decode(strt) + (double) (Integer.decode(z))/ (10 z_num);} else {sum = Integer.decode(xs);}xs = "";jtf.setText(null);} else if (s.equals("+")) {fh = 1;int point = xs.indexOf(".");if (point = -1) {String strt = xs.substring(0, point);String z = xs.substring(point + 1, xs.length());int z_num = z.length();sum = Integer.decode(strt) + (double) (Integer.decode(z))/ (10 z_num);} else {sum = Integer.decode(xs);}xs = "";jtf.setText(null);} else if (s.equals("sqrt")) {double x = Double.parseDouble(xs);double x1 = Math.sqrt(x);xs = x1 + "";jtf.setText(xs);} else if (s.equals("%")) {double x = Double.parseDouble(xs);x=0.01 xx;xs=x+"";jtf.setText(xs);} else if (s.equals("1/x")) {if (xs == "0") {jtf.setText("除数不能为0");} else {double x = Double.parseDouble(xs);double x1 = 1 / x;xs = x1 + "";jtf.setText(String.valueOf(xs));}} else if (s.equals("=")) {if (fh = 0) {switch (fh) {case 1:int point1 = xs.indexOf(".");if (point1 = -1) {String s1 = xs.substring(0, point1);String z1 = xs.substring(point1 + 1, xs.length());int z1_num = z1.length();xs = "";double ss1 = Integer.decode(s1)+ (double) Integer.decode(z1) / (10 z1_num);sum = sum + ss1;} else {sum = sum + Integer.decode(xs);xs = "";}fh = 0;break;case 2:int point2 = xs.indexOf(".");if (point2 = -1) {String s2 = xs.substring(0, point2);String z2 = xs.substring(point2 + 1, xs.length());int z2_num = z2.length();xs = "";double ss2 = Integer.decode(s2)+ (double) Integer.decode(z2) / (10 z2_num);sum = sum - ss2;} else {sum = sum - Integer.decode(xs);xs = "";}fh = 0;break;case 3:int point3 = xs.indexOf(".");if (point3 = -1) {String s3 = xs.substring(0, point3);String z3 = xs.substring(point3 + 1, xs.length());int z1_num = z3.length();xs = "";double s4 = Integer.decode(s3)+ (double) Integer.decode(z3) / (10 z1_num);sum = sum s4;} else {sum = sum Integer.decode(xs);xs = "";}fh = 0;break;case 4:int point4 = xs.indexOf(".");if (point4 = -1) {String s4 = xs.substring(0, point4);String z4 = xs.substring(point4 + 1, xs.length());int z4_num = z4.length();xs = "";double s5 = Integer.decode(s4)+ (double) Integer.decode(z4) / (10 z4_num);sum = sum / s5;} else {sum = sum / Integer.decode(xs);xs = "";}fh = 0;break;default:break;}xs = String.valueOf(sum);jtf.setText(xs);fh = 0;} else {jtf.setText(null);}}}Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stub}Overridepublic void keyReleased(KeyEvent e) { // TODO Auto-generated method stub }Overridepublic void keyTyped(KeyEvent e) { // TODO Auto-generated method stub }}。

beanshell用法(一)

beanshell用法(一)

beanshell用法(一)Beanshell使用指南Beanshell是一种Java解释器和脚本语言,为Java应用程序提供了动态执行的能力。

它具有简洁的语法和易用的接口,使得开发者可以很方便地在Java环境中编写和执行脚本。

以下是关于Beanshell 的一些常见用法和详细讲解。

1. Beanshell的安装和配置下载和安装BeanshellBeanshell可以从官方网站(配置Beanshell解释器在Java应用程序中使用Beanshell之前,需要配置Beanshell解释器。

可以通过创建Beanshell解释器对象并设置系统变量来实现:import ;Interpreter interpreter = new Interpreter();("变量名", 变量值);2. Beanshell常见用法执行简单表达式Beanshell可以像执行Java代码一样执行简单的表达式。

以下示例演示了如何使用Beanshell计算表达式的值:Interpreter interpreter = new Interpreter();try {Object result = ("1 + 2");("结果:" + result);} catch (Exception e) {();}调用Java方法Beanshell可以直接调用Java类和方法。

下面的示例展示了如何在Beanshell脚本中调用Java中的方法:Interpreter interpreter = new Interpreter();try {("import ;");("Date date = new Date();");("(());");} catch (Exception e) {();}编写和执行脚本文件除了在Java代码中嵌入脚本,Beanshell还支持将脚本代码保存在文件中并执行。

jmeter beanshell科学计数转换整数

jmeter beanshell科学计数转换整数

jmeter beanshell科学计数转换整数在使用JMeter进行性能测试的过程中,我们通常需要进行数据处理和计算,为了便于这些操作的实现,JMeter提供了一个内置的解释器,并支持使用BeanShell Expressions即BeanShell脚本进行数据处理和计算。

在BeanShell脚本中,常用的操作包括类型转换、字符串拼接等,但有时需要对科学计数进行转换成整数。

下面将分步骤介绍如何实现这个需求。

1.创建BeanShell Sampler首先,在 JMeter中添加一个BeanShell Sampler。

登录JMeter,右键单击测试计划节点,选择添加 >Sampler > BeanShell Sampler.2.编写BeanShell脚本接下来编写BeanShell脚本。

在 BeanShell Sampler 中,我们可以编写一段BeanShell脚本来实现:String value = "1.234E7";int result = (int) Double.parseDouble(value);在这个脚本中,实现如下操作:首先,我们创建一个字符串value,它的值是科学计数字符串1.234E7。

然后,我们使用java中的Double的类型转换方法parseDouble对value进行转换,把字符串转换为double类型。

最后,我们将 double 类型强制转换为int 类型,将科学计数转换成整数,并将其存储在result变量中。

3.运行测试计划保存 BeanShell Sampler。

然后单击运行按钮以运行测试计划。

当测试计划执行BeanShell Sampler时,BeanShell脚本将执行,将科学计数转换成整数,并将结果存储在result变量中。

总结:在JMeter中使用BeanShell脚本可以轻松地实现各种数据处理和计算功能。

本文中介绍了如何将科学计数转换成整数。

beanshell 调用java方法

beanshell 调用java方法

beanshell 调用java方法BeanShell是一个轻量级、可嵌入的Java源代码解释器,允许在Java环境中使用BeanShell脚本编写和执行Java代码。

通过BeanShell,我们可以直接在代码中调用Java方法,实现更灵活的编程逻辑。

BeanShell脚本是以Java语法编写的,并且可以直接调用Java类、对象和方法。

在使用BeanShell调用Java方法时,需要遵循一些规则和注意事项。

接下来,我将详细介绍如何在BeanShell中调用Java方法。

1.导入Java类在BeanShell中调用Java方法之前,首先需要导入相应的Java 类。

可以使用BeanShell提供的`import()`方法导入Java类。

例如,要调用`java.util.Date`类的方法,可以使用以下代码导入:```import java.util.Date;```2.创建Java对象在BeanShell中,可以直接使用Java的`new`关键字创建Java对象。

例如,要创建一个`Date`类的对象,可以使用以下代码:```Date date = new Date();```这样就会创建一个当前时间的`Date`对象并赋值给`date`变量。

3.调用Java方法一旦创建了Java对象,就可以直接调用对象的方法。

在BeanShell中,可以使用对象的名称和方法的名称直接进行调用。

例如,要调用`Date`对象的`toString()`方法,可以使用以下代码:```String dateString = date.toString();```这样就会将`Date`对象转换为字符串,并将结果赋值给`dateString`变量。

4.传递参数在调用Java方法时,有时需要传递参数。

在BeanShell中,可以将参数直接传递给方法。

例如,`Date`类的`setTime(long time)`方法可以接受一个长整型参数以设置日期对象的时间。

第4章_JSP与JavaBean

第4章_JSP与JavaBean

25
• 注意:当两个客户同时请求一个JSP页 面时,一个用户对自己Bean属性的改变, 不会影响另外一个客户。
26
4、scope取值application Bean的有效范围是application期间。 Tomcat服务器为所有的JSP页面分配一 个共享的bean. 当几个客户同时访问一个JSP页面时,任 何一个客户对自己的bean的属性的改变 都会影响到其他用户。
7?javabean和jsp技术的结合不仅可以实现表现层和商业逻辑层的分离而且可以提高jsp程序的运行效率和代码重用的程度还可以实现并行开发是jsp编程中常用的技术
第4章 JSP 与 JavaBean
1
本章主要内容:
• 编写和使用JavaBean; • 使用有关标记加载JavaBean、设置 和获取JavaBean的属性值; • 针对实际问题编写JSP页面。
28
程序算法: Circle.java: 声明三个变量,表示圆的半径/面积/周长: radius/circleArea/circleLength 定义三个方法,分别获取圆的半径/面积/周长的值 useBean.jsp: 导入包"small.dog" 以类"small.dog.Circle"创建一个对象,对象名是:girl 设置对象girl的半径为100 输出对象girl的半径,周长,面积的值。
29
30
Package small.dog; import java.io.* ; public class circle { double radius; public void setRadius(double radius) { this.radius=radius; } public double getRadius() { returnn
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下面的代码是实现的Javabeans: public class counter extends 0bJect(
public String path=一;
public char U counts: publ ic char [】 docount
(string
s1)ath)
throws
FileNotFoundExceptiOn
.(。uLpri?t:k佃g src瓮_冀8e?s/。十countS[1],·
Jpg\j width=\屯5\。helght-\b5\'‘);

。.、。.
.羔『:竺.二:芝乏-三墨。j警8=。4。>名访客!</f。np</h2>
3图兰竺苎要望计警器应昱一,
、.
本登篓粤含一个Js?曩要11舱geTest·tjs尘二食竺v.

univer8ity. Hubei wuchang 430062)
●‘
摘要:本文通过介绍JSP技术的特点,研究了在JSP中使用JavaBeans技术的方法,实现了利用JSP中调用JavaBeans,最
后给出一个使用JavaBeanS技术实现的图片模式的访问计数器。
关键词:JSP;JavaBeanS:图片模式;访问计数器
!。竺:81111∞ge/1啪geTest·Jsp,提交后查询的结果界面
虫Ⅱ!!:三:愿零。
4结束蔓
。.~.,
。..
…,。
。二罢苎!aV?B:竺:馋望■翌翌兴的!曹笔术,功登登
大,易于移植,受到越来越多的开发者的重视。使用JsP标记
张国萍,女,湖北大学教育学院课程与教学论专‘‘ 业2007
级研尧至:堇妻薪嘉另高:袤举亲磊甚再;~。 科……员“~:簧… ¥萎交…瓦最一妥霖::。霸‘笺。吴一;‘蕞‘≥菇~ 莓“ 磊&。绩一管理办公室主一。任
科技广场 SCIENCE MOSAIC 2009(5)
参考文献(3条) 1.耿祥义;张跃平 JSP实用教程 2003 2.布朗登;邱仲潘 Java开发指南 2002 3.林上杰;林康司 JSP2.0技术手册 2004
本文链接:/Periodical_kjgc200905048.aspx
参考文献
.……………‘ ‘。.[1]林上杰,林康司.JsP2.o技术手册[M】.北京:电子工
业出赢鞋:嘉复:…1。。 一…函希朗登著.邱仲潘译.Ja。a开‘发指。南。[M…】.北京。 :。 电子 工业茁砬茬j;oj;.… 出~一版…磊茬。j:-谈茹藉晶义:,…张~跃。平.JsP实…用… 教程~【M一 】.…北京…:清~华‘ 大学

JsP技术的核心是servlet.servlet是在服务器端执 行的Java程序,它支持酐TP协议并处理请求(Request)和 回应(Response).当JsP容器接收到web用户的一个JsP 请求时,它对JsP文件进行了语法分析并生成Java Servlet源文件。然后对其编译.
JsP文件处理流程如图一所示:
keyv旧nds:JSP; JavaBeans; Picture Pattern; Access Counters
0引育 JsP(Java Server Pages)是由sun公司倡导,许多别的
公 可I司糍参动与态一的起,建高立性的能一的种、动 安态 全的网、页跨技平术台标的准先,进利动用态这网一站技.术
this.path=sDath; BufferedReader file;
String cOuntFile=path; file=ne_ BufferedReader
File));
String readStr=null; int writeStr=1;
(ne- FileReader(count-
图一JsP文件处理流程
try(readstr==;file.readLine();) catch(IoExcepti∞e)(sy8tem.out.println(。读取数 据错误。):)
万方数据
●一
个 使 用 L
∞ ‘ ∞

o ∞ 3 们

现 访 问 计 数 器
的 L ∽jor(int 1卸;÷q。unts-e:1sth;i抖), ,,
中图分类号:TP311
文献标识码:A
文章编号:1671—4792一(2009)5—0134—02
AbstraCt:By introducing J≤、P techn0109y,this article studies the methods of the u8e of JaVaBeans technol—
Ogy in JS;P,achieves the use of JavaBeans by means of JS’P.and.finally。gives 8n example of an acces8 counter
with a picture I,attern realized by using JaVaBeans technology.
!!竺?s蚤!!!u:·tjava),访问.-:?1877:页面(女?阜_=
墅需!.:竺辱兰銮笪Lc:!·堂::筌翌:。慧翌粤:!?三翌奎奎 奎譬兰簪篓堡瓷鍪堂运算,最后将次数以图片的形式结果显
示出来(如图二所示)。
或者脚本来生成页面上的动态内容,具有广泛的应用前景.
…‘幕支芬析磊薪聂孑j品覆鬲Z:a≤:n。动慕文莱妄件, 所述支莱甬孚萎磊二二奉图片簇芸的计数器,五哥饭矗扇孚; 最萎藻主磊牟:粪勤蘸葙硅葩森真著装孬晶聂桌j“。…~
2 JavaBeans封装的数据库访问
JavaBeans是Java的组件模型,是一个可重复使用的软 件组件。可以看作是一种Java类,JaveBeans的使用是JSP 的一大特点.在服务器端,JsP引擎(在本文中我们使用的是 T伽cat)解释JsP标记和小脚本,生成所请求的内容,然后通 过访问J8v8Bean8组件。并且将结果以HT儿页面的形式发 送回浏览器.
JavaBe醐s是一种可重复使用的平台独立的软件组件, 它可以被Applet/Serylets/JsP等Java应用程序调用,也 可以可视化地被Java开发工具使用。
当JsP与一个JavaBeans类结合在一起时,可以提供 一种使内容和显示逻辑分开的简单方式.分开内容和显示逻 辑的好处是。更新页面外观的人员不必懂得Java代码,而更 新JavaBeans类的人员也不必是设计网页的行家高手。这样 就可以用带JavaBeans类的JsP页面来定义web模板,以建 立—个由具有相似的外观页面组成的网站。 1 JSP的体系结构及开发环境配置
万方数据
一个使用JavaBeans实现访问计数器的JSP应用
作者: 作者单位:
刊名: 英文刊名: 年,卷(期):
张国萍, 黄美凤, Zhang Guoping, Huang Meifeng 张国萍,Zhang Guoping(湖北大学教育学院,湖北,武昌,430062), 黄美凤,Huang Meifeng(湖北大学教务处,湖北,武昌,430062)
K一
张国萍t黄美凤z
Zhang Guoping Huang Meifeng
(1.湖北大学教育学院.湖北武昌430062;2.湖北大学教务处,湖北武昌430062)
(1.Faculty of
Educati∞.Hubei University.HuBei wuchang 430062; 2.Acade皿ic Administration.Hubei
相关文档
最新文档