Java Web应用开发——作业四

Posted 准时准点睡觉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Web应用开发——作业四相关的知识,希望对你有一定的参考价值。

一.单项选择题(共3题,30.0分)
1
如何获取一个 Cookie[]( )
A、
request.getCookies()

B、
request.getCookie()

C、
response.getCookies()

D、
response.getCookie()

正确答案: A

2
( )隐式对象可以处理 jsp 页面运行中的错误或者异常

(10.0分)
A、
pageContext

B、
page

C、
session

D、
exception

正确答案: D

3
下列选项中,( )可以准确地获取请求页面的一个文本框的输入 (文本框的名称为 name) .

(10.0分)
A、
request.getParameter(name)

B、
request.getParameter(“name” )

C、
request.getParameterValues(name)

D、
request.getParameterValues(“name”)

正确答案: B

二.判断题(共10题,70.0分)
1
如果 SetMaxAge()方法中的值为负值表明要立即删除该 cookie 对象。

正确答案:×

2
可以通过调用 SetMaxAge()方法来设置 cookie 将要存在的最大时间。

正确答案:√

3
与 Session 不同的是, 所有客户的 application 对象都是同一个, 即所有客户共享这个内置 的 application 对象。

正确答案:√

4
response.setHeader(“refresh”,“2”) 可以实现两秒钟刷新一次的效果。

正确答案:√

5
在某些情况下,当响应客户时,需要将客户重新引导至另一个页面,这时可以使用 response 对象的 sendRedirect(URL)方法实现客户的重定向。

正确答案:√

6
Session对象通常存在于客户端。

正确答案:×

7
Out 对象的 clearBuffer() 方法用来清除缓冲区里的数据, 但并不把数据写到客户端。

正确答案:×

8
JSP 内置对象是指不用声明就可以在 JSP 页面的脚本部分使用的对象。

正确答案:√

9
在设置 cookie 的最大存在时间时,可以设置为负值和零。

正确答案:√

10
Cookie 文件是存放在服务器端的。

正确答案:×

软件工程概论第一次作业

1.需要网站系统开发需要掌握的技术;

1)lJava语言

2)面向对象分析设计思想

3)设计模式和框架结构

4)XML语言

5)网页脚本语言

6)数据库

7)应用服务器

8)集成开发环境

 下面我们具体地看每个技术.

1、Java语言

Java语言体系比较庞大,包括多个模块。从WEB项目应用角度讲有JSP、Servlet、JDBC、JavaBean(Application)四部分技术。

 1)、Java Database Connectivity (JDBC)技术

Java Web应用开发中,数据库管理系统(RDBMS)的使用是不可缺少的。JDBC(Java Database Connectivity) 是一种用于执行 SQL 语句的 Java API。它由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的API,使他们能够用纯Java API 来编写数据库应用程序。

简单地说,JDBC 可做三件事:

l与数据库建立连接,

l发送 SQL 语句,

l处理结果。

 

 (2)、Servlet技术

Servlet是运行在服务器端的程序,可以被认为是服务器端的applet。servlet被Web服务器(例如Tomcat)加载和执行,就如同applet被浏览器加载和执行一样。servlet从客户端(通过Web服务器)接收请求,执行某种操作,然后返回结果。

 Servlet的主要优点包括

lServlet是持久的。servlet只需Web服务器加载一次,而且可以在不同请求之间保持服务(例如一次数据库连接)。

lServlet是与平台无关的。如前所述,servlet是用Java编写的,它自然也继承了Java的平台无关性。

lServlet是可扩展的。由于servlet是用Java编写的,它就具备了Java所能带来的所有优点。Java是健壮的、面向对象的编程语言,它很容易扩展以适应你的需求。servlet自然也具备了这些特征。

lServlet是安全的。从外界调用一个servlet的惟一方法就是通过Web服务器。这提供了高水平的安全性保障,尤其是在你的Web服务器有防火墙保护的时候。

lServlet可以在多种多样的客户机上使用。由于servlet是用Java编写的,所以你可以很方便地在HTML中使用它们。

 

3)、JavaServer Pages(JSP) 技术

JSP是从Servlet上分离出来的一小部分,简化了开发,加强了界面设计。JSP定位在交互网页的开发。运用Java语法,但功能较Servlet弱了很多,并且高级开发中只充当用户界面部分。JSP容器收到客户端发出的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式响应给客户端。其中程序片段可以是:操作数据库、重新定向网页以及发送 E-Mail 等等,这些都是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,与客户端的浏览器无关,因此,JSP 称为Server-Side Language。

 

JavaServer Pages的主要优点包括

●一次编写,各处执行(Write once, Run Anywhere)特性

作为Java 平台的一部分,JavaServer Pages 技术拥有Java语言“一次编写,各处执行”的特点。随着越来越多的供货商将JavaServer Pages 技术添加到他们的产品中,您可以针对自己公司的需求,做出审慎评估后,选择符合公司成本及规模的服务器,假若未来的需求有所变更时,更换服务器平台并不影响之前所投下的成本、人力所开发的应用程序。

● 搭配可重复使用的组件

JavaServer Pages技术可依赖于重复使用跨平台的组件(如:JavaBean或Enterprise JavaBean组件)来执行更复杂的运算、数据处理。开发人员能够共享开发完成的组件,或者能够加强这些组件的功能,让更多用户或是客户团体使用。基于善加利用组件的方法,可以加快整体开发过程,也大大降低公司的开发成本和人力。

● 采用标签化页面开发

Web 网页开发人员不一定都是熟悉Java 语言的程序员。因此,JSP 技术能够将许多功能封装起来,成为一个自定义的标签,这些功能是完全根据XML 的标准来制订的,即JSP 技术中的标签库(Tag Library)。因此,Web 页面开发人员可以运用自定义好的标签来达成工作需求,而无须再写复杂的Java 语法,让Web 页面开发人员亦能快速开发出一动态内容网页。

今后,第三方开发人员和其他人员可以为常用功能建立自己的标签库,让Web 网页开发人员能够使用熟悉的开发工具,如同HTML 一样的标签语法来执行特定功能的工作。

● N-tier 企业应用架构的支持

有鉴于网际网络的发展,为因应未来服务越来越繁杂的要求,且不再受地域的限制,因此,

必须放弃以往Client-Server的Two-tier 架构,进而转向更具威力、弹性的分散性对象系统。由于JavaServer Page 技术是Java 2 Platform Enterprise Edition (J2EE)集成中的一部分,它主要是负责前端显示经过复杂运算后之结果内容,而分散性的对象系统则是主要依赖EJB ( Enterprise JavaBean )和JNDI ( Java Naming and Directory Interface )构建而成。


4)、JavaBean(Application)应用组件技术
Application是Java应用程序,在WEB项目和一些开发中主要应用JavaBean。它就是Application的一部分,逻辑运算能力很强,能极大的发挥Java语言的优点。JavaBean 被称为是Java 组件技术的核心。JavaBean 的结构必须满足一定的命名约定。JavaBean能提供常用功能并且可以重复使用,这使得开发人员可以把某些关键功能和核心算法提取出来封装成为一个组件对象,这样就增加了代码的重用率和系统的安全性。

高级的WEB项目会应用到以上所有技术,它们之间联合使用和协作开发会提高开发的效率和系统的性能。 

2、面向对象分析设计思想

Java语言是完全面向对象的语言,所以在项目设计时会有很大的帮助,在设计时应尽量舍弃以往的面向过程的设计方式。 

在分析项目业务关系的时候,应用一些UML(Unified Modeling Language)图,例如常用的用例图(use case diagram),类图(class diagram),时序图(sequence diagram)等等,会有很大的帮助,这样能尽快找出业务逻辑主要面对的对象,然后对每个对象进行行为划分,最后再实现对象之间的集成和通信。


3、设计模式和框架结构

Java从语言角度来讲不是很难,但是从整体设计角度来讲我们还需要了解一些高级应用框架。如果要设计一个良好的框架结构,单单只掌握Java语言远远不够。这就涉及到一个设计模式,还有和设计模式相关的一些知识。 

设计模式在Java项目实施过程更是重中之重。主要在与两层的设计模式、三层的设计模式和N层的设计模式。它直接决定着项目的应用、部署和实际开发设计。 

在普通的WEB项目中很多采用两层的开发结构。JSP+Servlet或JSP+JavaBean。当对开发要求高的项目中使用很多的还是MVC的三层开发结构,也就是JSP+Servlet+JavaBean。它能分有效的分离逻辑开发,使开发人员能专注于各自的开发。同时也能时整个开发结构流程更清晰,但是需要比较高的开发配合度。 
在项目中,我们经常使用著名的Model-View-Controller(MVC)架构。MVC架构是随着smalltalk language语言的发展提出的,它是一个著名的用户界面设计架构。经典的MVC架构把一个组件(可认为是整个应用程序的一个模块)划分成三部分组 Model管理这个模块中所用到的数据和业务逻辑。而View 管理模块如何显示给用户,Controller 决定如何处理用户和该模块交互式时候产生的事件 如用户点击一个按钮等。 

4、XML语言

在服务器和设计模式结构中会应用到自定义文件,而且在应用高级设计时也会定义自用的标签,现在流行的是用XML去定义配置,所以XML语言应该有一定掌握。

当前,Java 2平台企业版(J2EE)架构在厂商市场和开发者社区中倍受推崇。作为一种工具,可扩展标记语言(XML)简化了数据交换、进程间消息交换这一类的事情,因而对开发者逐渐变得有吸引力,并开始流行起来。自然,在J2EE架构中访问或集成XML解决方案的想法也很诱人。因为这将是强大系统架构同高度灵活的数据管理方案的结合。

XML的应用似乎是无穷无尽的,但它们大致上可以分为三大类:
1、简单数据的表示和交换(针对XML的简单API(SAX)和文档对象模型(DOM)语法解析,不同的文档类型定义(DTDs)和概要(schemas))
2、用户界面相关、表示相关的上下文(可扩展样式表语言(XSL),可扩展样式表语言转换(XSLT))
3、面向消息的计算(XML-RPC(远程过程调用),基于SOAP协议的Web 服务(Web Services),电子化业务XML(ebXML))

5、网页脚本语言
 
为了提高WEB项目的整体性能,提高人机交互的友好界面,网页的脚本语言是很有用处的,有的时候可以解决很大的难题或提高程序的性能和应用性。 

网页脚本语言的执行都是在客户端执行的,速度很很快,并且大多的操作与服务器没有交互运算,所以在一些应用中非常理想。在设计WEB项目的应用中,网页的脚本语言起着不能忽视的作用,所以如果设计WEB项目的应用中,对JavaScript应有一定的了解。

 

JavaScript是一种基于对象(Object Based)和事件驱动(Event Driven)并具有安全性能(Secure)的脚本语言。使用它的目的是与HTML超文本标记语言、Java 脚本语言(Java小程序)一起实现在一个Web页面中链接多个对象,与Web客户交互作用。从而可以开发客户端的应用程序等。它是通过嵌入或调入在标准的HTML语言中实现的。它具有以下几个基本特点:

1.它是一种脚本编写语言
JavaScript是一种脚本语言,它采用小程序段的方式实现编程。像其它脚本语言一样,JavaScript同样已是一种解释性语言,它提供了一个易的开发过程。 
它的基本结构形式与C、C++、VB十分类似。但它不像这些语言一样,需要先编译,而是在程序运行过程中被逐行地解释。它与HTML标识结合在一起,从而方便用户的使用操作。

2. 基于对象的语言。
 JavaScript是一种基于对象的语言,同时以可以看作一种面向对象的。这意味着它能运用自己已经创建的对象。因此,许多功能可以来自于脚本环境中对象的方法与脚本的相互作用。

3.简单性
 JavaScript的简单性主要体现在:首先它是一种基于Java基本语句和控制流之上的简单而紧凑的设计, 从而对于学习Java是一种非常好的过渡。其次它的变量类型是采用弱类型,并未使用严格的数据类型。

4.安全性
 JavaScript是一种安全性语言,它不允许访问本地的硬盘,并不能将数据存入到服务器上,不允许对网络文档进行修改和删除,只能通过浏览器实现信息浏览或动态交互。从而有效地防止数据的丢失。

5. 动态性
 JavaScript是动态的,它可以直接对用户或客户输入做出响应,无须经过Web服务程序。它对用户的响应,是采用以事件驱动的方式进行的。所谓事件驱动,就是指在主页(Home Page)中执行了某种操作所产生的动作,就称为“事件”(Event)。比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后,可能会引起相应的事件响应。 

6、开发工具

1)、数据库

在主要的应用中,数据库相关的环节应用很多,所以对数据库应该有一定了解。不能单单只了解一种数据库,因为在很多实际开发中会提出很多数据库解决方案,所以只有在了解多种数据库的情况下才能有一个比较方案。

对于数据库应该了解他的性能和一些基本的操作常识,还有该数据库的特点。而针对与Java语言WEB项目的数据库开发则主要是对JDBC的应用,还有数据库事务处理和连接池等高级概念的应用。

2)、Web服务器

 

同数据库一样,应该了解该服务器的性能,特点和一些常识。

在应用方面,Web服务器主要是针对于配置和部署,对目录的配置,调试;对配置文件属性的修改;对访问权限和并发性的控制;Java类的部署等。


3)、集成开发环境(IDE):

“公欲善其事, 必先利其器”. 对于Web应用开发人员来讲,好的集成开发环境(IDE:Integrated Development Enviroment)是非常重要的。目前在市场上占主导位置的一个集成开发工具就是Eclipse.

本次课堂测试的源程序代码:

package com.jaovo.msg.model;

 

public class User {

private int ID;

private String Username;

private String Nickname;

private String Password;

public int getID() {

return ID;

}

public String getUsername() {

return Username;

}

public void setUsername(String username) {

Username = username;

}

public String getNickname() {

return Nickname;

}

public void setNickname(String nickname) {

Nickname = nickname;

}

public String getPassword() {

return Password;

}

public void setPassword(String password) {

Password = password;

}

public void setID(int iD) {

ID = iD;

}

 

 

}

package com.jaovo.msg.Util;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

 

public class DBUtil {

public static Connection getConnection()

{

        //加载驱动

try {

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();

} catch (InstantiationException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

} catch (IllegalAccessException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

} catch (ClassNotFoundException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

 String user = "sa";

     String password = "yyh678";

     String url = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Users";// 数据源

 

     Connection con =null;

        try {

 con = DriverManager.getConnection(url, user, password);

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}// 连接数据库对象

  

   return con;

}

public static void close(Connection connection)

{

try {

if(connection!=null)

connection.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void close(PreparedStatement preparedstatement)

{

try {

if(preparedstatement!=null)

preparedstatement.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void close(ResultSet resultSet)

{

try {

if(resultSet!=null)

resultSet.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

package com.jaovo.msg.Util;

 

public class UserException extends RuntimeException{

 

public UserException() {

super();

// TODO Auto-generated constructor stub

}

 

public UserException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {

super(message, cause, enableSuppression, writableStackTrace);

// TODO Auto-generated constructor stub

}

 

public UserException(String message, Throwable cause) {

super(message, cause);

// TODO Auto-generated constructor stub

}

 

public UserException(String message) {

super(message);

// TODO Auto-generated constructor stub

}

 

public UserException(Throwable cause) {

super(cause);

// TODO Auto-generated constructor stub

}

}

package com.jaovo.msg.dao;

 

import java.util.List;

 

import com.jaovo.msg.model.User;

 

public interface IUserDao {

//定义接口

public void add(User user);

public void delete(User user);

public void update(User user);

public User load(int ID);

public User load(String Username);

public List<User> load();

 

}

package com.jaovo.msg.dao;

 

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

 

import com.jaovo.msg.Util.DBUtil;

import com.jaovo.msg.Util.UserException;

import com.jaovo.msg.model.User;

 

public class UserDaoImpl implements IUserDao {

 

@Override

public void add(User user) {//增加用户

//获得连接对象

//System.out.println("在心里");

Connection connection = DBUtil.getConnection();

//准备sql语句

String sql = "select count(*) from table_user where Username=?";

//创建语句传输对象

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

preparedStatement=connection.prepareStatement(sql);

preparedStatement.setString(1, user.getUsername());

//接受结果集

resultSet=preparedStatement.executeQuery();

//遍历结果集

while(resultSet.next())

{

if(resultSet.getInt(1)>0)

{

throw new UserException("用户已存在") ;

}

}

sql="insert into table_user(Username,Password,Nickname) values (?,?,?)";

preparedStatement=connection.prepareStatement(sql);

preparedStatement.setString(1, user.getUsername());

preparedStatement.setString(2, user.getPassword());

preparedStatement.setString(3, user.getNickname());

preparedStatement.executeUpdate();

System.out.println("存储成功");

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

//关闭资源

DBUtil.close(resultSet);

DBUtil.close(preparedStatement);

DBUtil.close(connection);

 

}

}

 

@Override

public void delete(User user) {

//获得连接对象

   Connection connection = DBUtil.getConnection();

//准备sql语句

   String sql = "delete from table_user where Username= ?";

//创建语句传输对象

   PreparedStatement preparedStatement = null;

   try {

preparedStatement= connection.prepareStatement(sql);

preparedStatement.setString(1, user.getUsername());

preparedStatement.executeUpdate();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

DBUtil.close(preparedStatement);

DBUtil.close(connection);

}

 

}

 

@Override

public void update(User user) {

//获得连接对象

   Connection connection = DBUtil.getConnection();

//准备sql语句

   String sql = "update table_user set Password = ?,Nickname = ?where Username=?";

//创建语句传输对象

   PreparedStatement preparedStatement = null;

   try {

preparedStatement= connection.prepareStatement(sql);

preparedStatement.setString(1, user.getPassword());

preparedStatement.setString(2, user.getNickname());

preparedStatement.setString(3,user.getUsername());

preparedStatement.executeUpdate();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

DBUtil.close(preparedStatement);

DBUtil.close(connection);

}

 

}

 

@Override

public User load(int ID) {

//获得连接对象

   Connection connection = DBUtil.getConnection();

//准备sql语句

   String sql = "select * from table_user where ID=?";

//创建语句传输对象

   PreparedStatement preparedStatement = null;

   ResultSet resultSet=null;

   User user=null;

   try {

preparedStatement=connection.prepareStatement(sql);

preparedStatement.setInt(1, ID);

resultSet=preparedStatement.executeQuery();

while(resultSet.next())

{

user=new User();

user.setID(ID);

user.setPassword(resultSet.getString("Password"));

user.setUsername(resultSet.getString("Username"));

user.setNickname(resultSet.getString("Nickname"));

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

DBUtil.close(resultSet);

DBUtil.close(preparedStatement);

DBUtil.close(connection);

}

return user;

}

 

@Override

public User load(String Username) {

//获得连接对象

   Connection connection = DBUtil.getConnection();

//准备sql语句

   String sql = "select * from table_user where Username=?";

//创建语句传输对象

   PreparedStatement preparedStatement = null;

   ResultSet resultSet=null;

   User user=null;

   try {

preparedStatement=connection.prepareStatement(sql);

preparedStatement.setString(1, Username);

resultSet=preparedStatement.executeQuery();

while(resultSet.next())

{

user=new User();

user.setID(resultSet.getInt("ID"));

user.setPassword(resultSet.getString("Password"));

user.setUsername("Username");

user.setNickname(resultSet.getString("Nickname"));

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

DBUtil.close(resultSet);

DBUtil.close(preparedStatement);

DBUtil.close(connection);

}

return user;

}

 

@Override

public List<User> load() {

//获得连接对象

   Connection connection = DBUtil.getConnection();

//准备sql语句

   String sql = "select * from table_user";

//创建语句传输对象

   PreparedStatement preparedStatement = null;

   ResultSet resultSet=null;

   List<User> users=new ArrayList<User>();

   User user=null;

   try {

preparedStatement=connection.prepareStatement(sql);

resultSet=preparedStatement.executeQuery();

while(resultSet.next())

{

user=new User();

user.setID(resultSet.getInt("ID"));

user.setPassword(resultSet.getString("Password"));

user.setUsername(resultSet.getString("Username"));

user.setNickname(resultSet.getString("Nickname"));

users.add(user);

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

DBUtil.close(resultSet);

DBUtil.close(preparedStatement);

DBUtil.close(connection);

}

return users;

}

  public void bianli(User user)

  {

//获得连接对象

Connection connection = DBUtil.getConnection();

//准备sql语句

String sql = "select count(*) from table_user where Username=?";

//创建语句传输对象

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

preparedStatement=connection.prepareStatement(sql);

preparedStatement.setString(1, user.getUsername());

//接受结果集

resultSet=preparedStatement.executeQuery();

//遍历结果集

while(resultSet.next())

{

if(resultSet.getInt(1)==0)

{

throw new UserException("登陆失败,用户不存在") ;

}

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

//关闭资源

DBUtil.close(resultSet);

DBUtil.close(preparedStatement);

DBUtil.close(connection);

 

}

  }

  public int empty(User user)

  {

  int m=0;

//获得连接对象

Connection connection = DBUtil.getConnection();

//准备sql语句

String sql = "select count(*) from table_user where Username=?";

//创建语句传输对象

PreparedStatement preparedStatement = null;

ResultSet resultSet = null;

try {

preparedStatement=connection.prepareStatement(sql);

preparedStatement.setString(1, user.getUsername());

//接受结果集

resultSet=preparedStatement.executeQuery();

//遍历结果集

while(resultSet.next())

{

if(resultSet.getInt(1)>0)

{

m=1;

}

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

//关闭资源

DBUtil.close(resultSet);

DBUtil.close(preparedStatement);

DBUtil.close(connection);

 

}

return m;

  }

}

运行结果截图:

 

说明课堂测试未按时完成的原因:

周六听课后,课下没有复习,只知道老师在上课的时候大概讲了什么,不会动手操作。在上课之前,一直在学习如何链接数据库,刚学会如何链接数据库,怎么建表。而且关于网页的好多东西都不明白是怎么回事,好多方法都不知道怎么用。

 

列出你对这门课的希望和自己的目标,并具体列出你计划每周花多少时间在这门课上:

学完这门课后,我希望自己可以独立设计一个网站,类似教务系统那样,可以实现对数据库的增删改查,还可以在手机上使用。对于学习这门课的时间,我想,除了上课时间,每周都要有至少14小时来学习这门课程。

以上是关于Java Web应用开发——作业四的主要内容,如果未能解决你的问题,请参考以下文章

《移动WEB前端高级开发实践@www.java1234.com》——3

web前端期末大作业--响应式室内家具网页设计(HTML+CSS+JS)

Web前端期末大作业--汽车主题网页设计002(HTML+CSS+JavaScript+)实现

Web前端期末大作业-响应式唯美婚庆公司网站网页设计(HTML+CSS+JavaScript)

Web前端期末大作业-响应式唯美婚庆公司网站网页设计(HTML+CSS+JavaScript)

Web前端期末大作业--零食商城网页设计(HTML+CSS+JavaScript+)实现