2021-03-30

Servlet+HTML+Jquery+JDBC

Jquery_ajax

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。

通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

jQuery中常用的AJAX方法

1.load()从服务器加载数据,并把返回的数据放置到指定的元素中

格式:$(selector).load(url,data,function(response,status,xhr))

url-您需要加载的 URL

data-请求参数

function(response,status,xhr)--完成时运行的回调函数

response - 包含服务器返回的结果数据

status - 包含请求的状态"success"、"notmodified"、"error"、"timeout"、"parsererror"

xhr - 包含 XMLHttpRequest 对象

2.$.ajax--执行异步 AJAX 请求

格式:$.ajax({name:value, name:value, ... })

url----您需要加载的 URL 例如:$.ajax({url:login”})

type--规定请求的类型(GET 或 POST) 例如:$.ajax({url:login,type:GET”})

data--规定要发送到服务器的数据.

dataType--服务器响应的数据类型

success(result,status,xhr)---当请求成功时运行的函数

async---布尔值,表示请求是否异步处理。默认是 true。

error(xhr,status,error)--如果请求失败要运行的函数

3.$.get()--使用 AJAX 的 HTTP GET 请求从服务器加载数据

格式:$.get(URL,data,function(data,status,xhr),dataType)

url----您需要加载的 URL 

data--规定要发送到服务器的数据.

function(data,status,xhr)---当请求成功时运行的函数

dataType--服务器响应的数据类型  text  json  xml

4.$.post()--使用 AJAX 的 HTTP POST 请求从服务器加载数据

格式:$(selector).post(URL,data,function(data,status,xhr),dataType)

url----您需要加载的 URL 

data--规定要发送到服务器的数据.

function(data,status,xhr)---当请求成功时运行的函数

dataType--服务器响应的数据类型  text  json  xml

例如:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试jquery的ajax</title>
		<!-- 导入jquery函数库-->
		<script src="js/jquery-3.5.1.js"></script>
		<script>
			$(function(){
				$("#but1").click(function(){
					$.get("http://127.0.0.1:8080/ajax/test",
						function(data){
							$("#h1").text(data);
						},"text");
				});
				$("#but2").click(function(){
					$.post("http://127.0.0.1:8080/ajax/test",
						function(data){
							$("#h1").text(data);
						},"text");
				});
				//get发送有参数的请求
				/*
				$("#but3").click(function(){
					var username=$("#text1").val();
					var password=$("#text2").val();
					$.get("http://127.0.0.1:8080/ajax/hello?username="+username+"&password="+password,
						function(data){
							$("#h1").text(data);
						},"text");
				});
				*/
				$("#but3").click(function(){
					var username=$("#text1").val();
					var password=$("#text2").val();
					var data="username="+username+"&password="+password;
					$.get("http://127.0.0.1:8080/ajax/hello",
						  data,
						  function(data){
							$("#h1").text(data);
						},"text");
				});
				//post发送有参数的请求
				/*
				$("#but4").click(function(){
					var username=$("#text1").val();
					var password=$("#text2").val();
					$.post("http://127.0.0.1:8080/ajax/hello?username="+username+"&password="+password,
						  function(data){
							$("#h1").text(data);
						},"text");
				});
				*/
			   /*
			   $("#but4").click(function(){
			   	var username=$("#text1").val();
			   	var password=$("#text2").val();
			   	var data="username="+username+"&password="+password;
			   	$.post("http://127.0.0.1:8080/ajax/hello",
					  data,
			   		  function(data){
			   			$("#h1").text(data);
			   		},"text");
			   });
			   */
			   $("#but4").click(function(){
			   	var username=$("#text1").val();
			   	var password=$("#text2").val();
				var data={"username":username,"password":password};
			   	$.post("http://127.0.0.1:8080/ajax/hello",
						data,
			   		   function(data){
			   			$("#h1").text(data);
			   		},"text");
			   });
			   //get方式返回json字符串
			   $("#but5").click(function(){
			   	$.get("http://127.0.0.1:8080/ajax/mytest",
			   		function(data){
						//dataType===“text”---json字符串==>json对象
						//var jsonObj=JSON.parse(data);
						//var stuinfo=jsonObj.stuid+","+jsonObj.stuname;
						//$("#h1").text(stuinfo);
						//dataType==="json"--json对象
						$("#h1").text(data);
			   		},"json");
			   });
			   //post方式,返回json
			   $("#but6").click(function(){
			   	$.post("http://127.0.0.1:8080/ajax/mytest",
			   		function(data){
			   			//dataType==="json"--json对象
			   			$("#h1").text(data);
			   		},"json");
			   });
			});
		</script>
	</head>
	<body>
		<input id="but1" type="button" value="测试get方法发送无参数的ajax请求">
		<input id="but2" type="button" value="测试post方法发送无参数的ajax请求"><br>
		<input id="but3" type="button" value="测试get方法发送有参数的ajax请求">
		<input id="but4" type="button" value="测试post方法发送有参数的ajax请求"><br>
		<input id="but5" type="button" value="测试get方法发送ajax请求,返回json">
		<input id="but6" type="button" value="测试post方法发送ajax请求,返回json"><br>
		<input id="text1" type="text" /><br>
		<input id="text2" type="text" /><br>
		<h1 id="h1"></h1>
	</body>
</html>

Servlet+HTML+Jquery+JDBC

1. 创建数据库表

create  table t_student(
stu_id  int primary key auto_increment,
stu_name varchar(20),
stu_pass varchar(20),
stu_age int,
stu_address varchar(30)
);

2. 创建javaweb项目ServletJSPJDBC,[修改Content Root为sjj],修改工程访问名称

3. 导入第三方依赖【druid-1.1.10.jar  mysql-connector-java-5.1.38-bin.jar】

4. 在src下创建数据库连接配置文件【xxxxxxxx.properties】

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
initialSize=100
maxActive=300
maxWait=60000

5. 创建javabean

package com.wangxing.student.bean;
/**
 * 保存学生信息的javabean
 * @author Administrator
 *
 */
public class StudentBean {
	private int stuid;
	private String  stuname;
	private String stupass;
	private int stuage;
	private String stuaddress;
	public int getStuid() {
		return stuid;
	}
	public void setStuid(int stuid) {
		this.stuid = stuid;
	}
	public String getStuname() {
		return stuname;
	}
	public void setStuname(String stuname) {
		this.stuname = stuname;
	}
	public String getStupass() {
		return stupass;
	}
	public void setStupass(String stupass) {
		this.stupass = stupass;
	}
	public int getStuage() {
		return stuage;
	}
	public void setStuage(int stuage) {
		this.stuage = stuage;
	}
	public String getStuaddress() {
		return stuaddress;
	}
	public void setStuaddress(String stuaddress) {
		this.stuaddress = stuaddress;
	}
}
package com.wangxing.sjj.bean;

public class Result {
	private boolean success;
	private String msg;
	public Result(boolean success,String msg){
		this.success=success;
		this.msg=msg;
	}
	public boolean isSuccess() {
		return success;
	}
	public void setSuccess(boolean success) {
		this.success = success;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
}

6. 创建数据访问接口以及实现类

package com.wangxing.student.dao.impl;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.wangxing.student.bean.StudentBean;
import com.wangxing.student.dao.StudentDao;
public class StudentDaoImpl implements StudentDao{
	private static StudentDaoImpl studentDao=null;
	// 定义保存druid数据源对象
	private DataSource dataSource = null;
	private StudentDaoImpl() {
			if(dataSource==null){
				try {
				Properties pro=new Properties();
				InputStream inStream=this.getClass().getResourceAsStream("/mysqldata.properties");
				pro.load(inStream);
				dataSource=DruidDataSourceFactory.createDataSource(pro);
				}catch(Exception e) {
					e.printStackTrace();
				}
			}
		}
	public static StudentDaoImpl getStudentDaoImpl(){
		if(studentDao==null){
			studentDao=new StudentDaoImpl();
		}
		return studentDao;
	}
	@Override
	public void insertStudent(StudentBean student)throws Exception{
		    Connection conn = dataSource.getConnection();
			String insert = "insert into t_student values(null,?,?,?,?);";
			PreparedStatement statement = conn.prepareStatement(insert);
			statement.setString(1, student.getStuname());
			statement.setString(2, student.getStupass());
			statement.setInt(3, student.getStuage());
			statement.setString(4, student.getStuaddress());
			int temp = statement.executeUpdate();
			statement.close();
			conn.close();
	}
	@Override
	public void updateStudent(StudentBean student)throws Exception{
		Connection conn = dataSource.getConnection();
		String update = "update t_student set stu_name=?,stu_pass=?,stu_age=?,stu_address=? where stu_id=?;";
		PreparedStatement statement = conn.prepareStatement(update);
		statement.setString(1, student.getStuname());
		statement.setString(2, student.getStupass());
		statement.setInt(3, student.getStuage());
		statement.setString(4, student.getStuaddress());
		statement.setInt(5, student.getStuid());
		int temp = statement.executeUpdate();
		statement.close();
		conn.close();
	}
	@Override
	public void deleteStudent(int stuid)throws Exception {
		Connection conn = dataSource.getConnection();
		String delete = "delete from t_student where stu_id=?;";
		PreparedStatement statement = conn.prepareStatement(delete);
		statement.setInt(1, stuid);
		int temp = statement.executeUpdate();
		statement.close();
		conn.close();
	}
	@Override
	public StudentBean selectStudentById(int stuid)throws Exception {
		StudentBean student=null;
		Connection conn = dataSource.getConnection();
		String select = "select * from t_student where stu_id=?;";
		PreparedStatement statement = conn.prepareStatement(select);
	    statement.setInt(1, stuid);
		ResultSet resultSet = statement.executeQuery();
		if (resultSet.next()) {
				int id = resultSet.getInt("stu_id");
				String name = resultSet.getString("stu_name");
				String pass = resultSet.getString("stu_pass");
				int age = resultSet.getInt("stu_age");
				String address = resultSet.getString("stu_address");
				student= new StudentBean();
				student.setStuid(id);
				student.setStuname(name);
				student.setStupass(pass);
				student.setStuage(age);
				student.setStuaddress(address);
			}
		resultSet.close();
		statement.close();
		conn.close();
		return student;
	}
	@Override
	public List<StudentBean> selectStudent()throws Exception {
		List<StudentBean> studenlist=new ArrayList<StudentBean>();
		Connection conn = dataSource.getConnection();
		String select = "select * from t_student;";
		PreparedStatement statement = conn.prepareStatement(select);
		ResultSet resultSet = statement.executeQuery();
		while(resultSet.next()) {
				int id = resultSet.getInt("stu_id");
				String name = resultSet.getString("stu_name");
				String pass = resultSet.getString("stu_pass");
				int age = resultSet.getInt("stu_age");
				String address = resultSet.getString("stu_address");
				StudentBean student= new StudentBean();
				student.setStuid(id);
				student.setStuname(name);
				student.setStupass(pass);
				student.setStuage(age);
				student.setStuaddress(address);
				studenlist.add(student);
			}
		resultSet.close();
		statement.close();
		conn.close();
		return studenlist;
	}
    @Override
	public boolean selectStudentByNameAndPass(StudentBean stu) throws Exception{
		boolean  flag=true;
		Connection conn = dataSource.getConnection();
		String select = "select * from t_student where stu_name=? and stu_pass=?;";
		PreparedStatement statement = conn.prepareStatement(select);
	    statement.setString(1, stu.getStuname());
	    statement.setString(2, stu.getStupass());
		ResultSet resultSet = statement.executeQuery();
		flag=resultSet.next();
		resultSet.close();
		statement.close();
		conn.close();
		return flag;
	}
}

7. 创建业务访问接口以及实现类

package com.wangxing.student.service.impl;
import java.util.List;
import com.wangxing.student.bean.StudentBean;
import com.wangxing.student.dao.StudentDao;
import com.wangxing.student.service.StudentService;
public class StudentServiceImpl implements StudentService{
	private StudentDao  stuentDao=null;
	public StudentServiceImpl(StudentDao  stuentDao){
		this.stuentDao=stuentDao;
	}
	@Override
	public void insertStudent(StudentBean student) throws Exception {
		stuentDao.insertStudent(student);
	}
	@Override
	public void updateStudent(StudentBean student) throws Exception {
		stuentDao.updateStudent(student);
	}
	@Override
	public void deleteStudent(int stuid) throws Exception {
		stuentDao.deleteStudent(stuid);
	}
	@Override
	public StudentBean selectStudentById(int stuid) throws Exception {
		return stuentDao.selectStudentById(stuid);
	}
	@Override
	public List<StudentBean> selectStudent() throws Exception {
		return stuentDao.selectStudent();
	}
    @Override
	public boolean selectStudentByNameAndPass(StudentBean stu)throws Exception {
		return stuentDao.selectStudentByNameAndPass(stu);
	}
}

8. 创建具体业务处理的Servlet

package com.wangxing.student.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wangxing.student.bean.StudentBean;
import com.wangxing.student.dao.impl.StudentDaoImpl;
import com.wangxing.student.service.StudentService;
import com.wangxing.student.service.impl.StudentServiceImpl;
/**
 * 处理添加操作的servlet
 * @author Administrator
 *
 */
public class StudentInsertServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		PrintWriter out=resp.getWriter();
		String stuname=req.getParameter("username");
		String stupass=req.getParameter("password");
		String stuage=req.getParameter("stuage");
		String stuaddress=req.getParameter("stuaddress");
		StudentBean  student=new StudentBean();
		student.setStuname(stuname);
		student.setStupass(stupass);
		student.setStuage(Integer.parseInt(stuage));
		student.setStuaddress(stuaddress);
		StudentService studentService=new StudentServiceImpl(StudentDaoImpl.getStudentDaoImpl());
		try {
			studentService.insertStudent(student);
			out.write(new Gson().toJson(new Result(true,"添加成功")));
		} catch (Exception e) {
			e.printStackTrace();
			out.write(new Gson().toJson(new Result(false,"添加失败")));
		}
		out.close();
    }
}
package com.wangxing.student.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wangxing.student.bean.StudentBean;
import com.wangxing.student.dao.impl.StudentDaoImpl;
import com.wangxing.student.service.StudentService;
import com.wangxing.student.service.impl.StudentServiceImpl;
/**
 * 处理修改操作的servlet
 * @author Administrator
 *
 */
public class StudentUpdateServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		PrintWriter out=resp.getWriter();
		String stuid=req.getParameter("stuid");
		String stuname=req.getParameter("username");
		String stupass=req.getParameter("password");
		String stuage=req.getParameter("stuage");
		String stuaddress=req.getParameter("stuaddress");
		StudentBean  student=new StudentBean();
		student.setStuid(Integer.parseInt(stuid));
		student.setStuname(stuname);
		student.setStupass(stupass);
		student.setStuage(Integer.parseInt(stuage));
		student.setStuaddress(stuaddress);
		StudentService studentService=new StudentServiceImpl(StudentDaoImpl.getStudentDaoImpl());
		try {
			studentService.updateStudent(student);
			out.write(new Gson().toJson(new Result(true,"修改成功")));
		} catch (Exception e) {
			e.printStackTrace();
			out.write(new Gson().toJson(new Result(false,"修改失败")));
		}
		out.close();
	}
}
package com.wangxing.student.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wangxing.student.bean.StudentBean;
import com.wangxing.student.dao.impl.StudentDaoImpl;
import com.wangxing.student.service.StudentService;
import com.wangxing.student.service.impl.StudentServiceImpl;
/**
 * 处理删除操作的servlet
 * @author Administrator
 *
 */
public class StudentDeleteServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		PrintWriter out=resp.getWriter();
		String stuid=req.getParameter("stuid");
		StudentService studentService=new StudentServiceImpl(StudentDaoImpl.getStudentDaoImpl());
		try {
			studentService.deleteStudent(Integer.parseInt(stuid));
			out.write(new Gson().toJson(new Result(true,"删除成功")));
		} catch (Exception e) {
			e.printStackTrace();
			out.write(new Gson().toJson(new Result(false,"删除失败")));
		}
		out.close();
	}
}
package com.wangxing.student.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wangxing.student.bean.StudentBean;
import com.wangxing.student.dao.impl.StudentDaoImpl;
import com.wangxing.student.service.StudentService;
import com.wangxing.student.service.impl.StudentServiceImpl;
/**
 * 处理根据id查询操作的servlet
 * @author Administrator
 *
 */
public class StudentSelectStudentServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		PrintWriter out=resp.getWriter();
		String stuid=req.getParameter("stuid");
		StudentService studentService=new StudentServiceImpl(StudentDaoImpl.getStudentDaoImpl());
		try {
			StudentBean student=studentService.selectStudentById(Integer.parseInt(stuid));
			out.write(new Gson().toJson(student));
		} catch (Exception e) {
			e.printStackTrace();
			out.write(new Gson().toJson(null));
		}
		out.close();
	}
}
package com.wangxing.student.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wangxing.student.bean.StudentBean;
import com.wangxing.student.dao.impl.StudentDaoImpl;
import com.wangxing.student.service.StudentService;
import com.wangxing.student.service.impl.StudentServiceImpl;
/**
 * 处理查询所有操作的servlet
 * @author Administrator
 *
 */
public class StudentSelectListServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		PrintWriter out=resp.getWriter();
		StudentService studentService=new StudentServiceImpl(StudentDaoImpl.getStudentDaoImpl());
		try {
			List<StudentBean> studentlist=studentService.selectStudent();
			out.write(new Gson().toJson(studentlist));
		} catch (Exception e) {
			e.printStackTrace();
		}
		out.close();
	}
}
package com.wangxing.sjj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wangxing.sjj.bean.StudentBean;
import com.wangxing.sjj.dao.impl.StudentDaoImpl;
import com.wangxing.sjj.service.StudentService;
import com.wangxing.sjj.service.impl.StudentServiceImpl;
public class StudentLoginServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		PrintWriter out=resp.getWriter();
		String name=req.getParameter("username");
		String pass=req.getParameter("password");
		StudentBean  stu=new StudentBean();
		stu.setStuname(name);
		stu.setStupass(pass);
		StudentService studentService=new StudentServiceImpl(StudentDaoImpl.getStudentDaoImpl());
		try{
		boolean flag=studentService.selectStudentByNameAndPass(stu);
		if(flag){
			out.write(new Gson().toJson(new Result(true,"登陆成功!")));
		}else{
			out.write(new Gson().toJson(new Result(false,"用户名密码有误!")));
		}
		}catch(Exception e){
			e.printStackTrace();
			out.write(new Gson().toJson(new Result(false,"用户名密码有误!")));
		}
		out.close();
	}
}
package com.wangxing.sjj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class StudentLogoutServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.getSession().invalidate();
		PrintWriter out=resp.getWriter();
		out.write(new Gson().toJson(new Result(true,"退出成功")));
		out.close();
	}
}

9. 添加字符过滤器

10. CORS过滤器

package com.wangxing.sjj.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CORSFilter implements Filter{
	@Override
	public void destroy() {
	}
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		//跨域请求,*代表允许全部类型
		response.setHeader("Access-Control-Allow-Origin", "*");
		//允许请求方式
		response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
		//用来指定本次预检请求的有效期,单位为秒,在此期间不用发出另一条预检请求
		response.setHeader("Access-Control-Max-Age", "3600");
		//请求包含的字段内容,如有多个可用哪个逗号分隔如下
		response.setHeader("Access-Control-Allow-Headers", "content-type,x-requested-with,Authorization, x-ui-request,lang");
		//访问控制允许凭据,true为允许
		response.setHeader("Access-Control-Allow-Credentials", "true");
		// 传递业务请求处理
		chain.doFilter(req, resp);
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}
}

11. 配置web.xml

12. 创建html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值