上传图片然后显示在JSP页面上

目标:我们想要有一个JSP页面,在这个页面上,我们可以输入新闻的标题、内容、来源及图片,
              点击提交按钮后,我们可以将数据存入数据库,然后,我们可以从数据库中取出相应的数据,
              并将其显示在JSP页面上。
实现:1.首先,我们要有一个JSP页面,用来提交信息,这里我们用index.jsp页面,在JSP页面上,我们有一个form表单,
                   这个表单上,我们可以提交新闻的标题、内容、来源及图片。
                   index.jsp 页面的具体实现代码如下:
  
  
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
 
String basePath = request.getScheme() + "://" + request.getServerName() +":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//获取URL
String p = basePath + "AddNewsServlet";
%>
<!-- 定义新闻所要输入信息,要提交的地方,以及方法,不要忘记要提交文件数据时,我们要加上enctype属性,属性值为:multipart/form-data -->
<form action = "<%=p%>" method = "post" name = "form1" enctype="multipart/form-data">
新闻题目:<input type = "text" name = "new_title" value = ""/>
新闻内容:<input type = "text" name = "new_content" value = ""/>
新闻来源:<input type = "text" name = "new_source" value = ""/>
新闻图片:<input type = "file" name = "new_image" value = ""/>
<input type = "submit" name = "submit" value = "提交"/>
</form>
</body>
</html>
       2.AddNewsServlet
(1)index.jsp提交数据到AddNewsServlet,在这里,我们将提取从index.jsp的form表单里获得的数据,记得获取表单中的数据时,应该使用
String new_title = new String(smartupload.getRequest().getParameter("new_title").trim().getBytes(),"utf-8");因为smartupload上传了文件,若直接使用request.getParameter()获取不到值,另外,还需注意,要创建new String对象来改变文字的编码方式,否则,会出现乱码。
(2)获取到数据之后,我们将这些数据封装在一个News对象中,并将它通过NewsImple中的addNews(News news)方法添加到数据库中,若成功添加,则返回select.jsp页面,否则返回录入界面index.jsp。
(3)AddNewsServlet具体实现代码如下:
   
   
package servlet;
 
import imple.NewsImple;
import inter.NewsInter;
 
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.UUID;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.PageContext;
 
import org.lxh.smart.SmartUpload;
import org.lxh.smart.SmartUploadException;
 
import entity.News;
 
/**
* Servlet implementation class AddNewsServlet
*/
public class AddNewsServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public AddNewsServlet() {
super();
// TODO Auto-generated constructor stub
}
 
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
}
 
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
 
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request,response);
}
 
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//设置编码方式
request.setCharacterEncoding("gb2312");
response.setCharacterEncoding("gbk");
//设置上传文件
SmartUpload smartupload = new SmartUpload();
try{
smartupload.setTotalMaxFileSize(4000*1024); // 设置上传的文件大小
smartupload.setMaxFileSize(4000*1024);
 
smartupload.initialize(this.getServletConfig(),request,response); // 初始化上传
smartupload.upload(); // 准备上传
String new_image=""; // 设置完整的图片名称
 
if(smartupload.getFiles().getSize()>0){
//定义图片名称为随机数+后缀
String image = UUID.randomUUID() + "." + smartupload.getFiles().getFile(0).getFileExt() ;
//获取当前日历
Calendar date=Calendar.getInstance();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
 
String name=format.format(date.getTime());
String[] s = name.split("-");
//定义文件,将文件按日历分层
File file=new File("d:/"+s[0]+"/"+s[1]+"/"+s[2]);
if(!file.exists()){
file.mkdirs();
}else{
file.delete();
file.mkdirs();
}
new_image = file.getPath() + "\\" + image;
//保存文件
smartupload.getFiles().getFile(0).saveAs(new_image) ;
}
//获取新闻信息
 
String new_title = new String(smartupload.getRequest().getParameter("new_title").trim().getBytes(),"utf-8");
String new_content = new String(smartupload.getRequest().getParameter("new_content").trim().getBytes(),"utf-8");
String new_source = new String(smartupload.getRequest().getParameter("new_source").trim().getBytes(),"utf-8");
News news=null;
news=new News();
news.setNew_title(new_title);
news.setNew_content(new_content);
news.setNew_source(new_source);
news.setImage(new_image);
//将新闻信息添加到数据库中
NewsInter n = new NewsImple();
boolean rs = n.addNews(news);
if(rs == true){
//成功则返回查询页面
request.getRequestDispatcher("select.jsp").forward(request, response);
}else{
//失败返回录入界面
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}catch (SmartUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 
}
 
}
        3.select.jsp 页面,在这个页面上有一个查询信息的按钮,具体代码如下:
    
    
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() +
":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//定义提交路径
String p = basePath + "SelectNewsServlet";
%>
<form action="<%=p%>" method = "post" name = "form2">
<input type = "submit" name = "submit" value = "查询新闻信息"/>
</form>
 
</body>
</html>
             4.点击提交按钮后,我们会跳转到SelectNewsServlet
              (1)在这里,我们通过NewsInter接口的NewsImple实现类中的getAllNews()方法获取新闻信息。
              (2)获取到信息后,我们将信息封装在列表中,然后跳转到title.jsp页面
              (3)SelectNewsServlet的具体实现代码如下:
    
    
package servlet;
 
import imple.NewsImple;
import inter.NewsInter;
 
import java.io.IOException;
import java.util.List;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import entity.News;
 
/**
* Servlet implementation class ParseXML
*/
public class SelectNewsServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SelectNewsServlet() {
super();
// TODO Auto-generated constructor stub
}
 
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
 
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
 
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request,response);
}
 
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//定义编码方式
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//获取新闻信息
NewsInter n = new NewsImple();
List<News> list = n.getAllNews();
request.setAttribute("list", list);
//跳转到title.jsp页面
request.getRequestDispatcher("title.jsp").forward(request, response);
}
 
}
         5.title.jsp页面
              (1)在title页面,我们获取到News的信息列表,并将它们显示在网页上
              (2)在列表中,我们显示新闻的标题信息,每一个标题信息都有一个链接,该链接链接到SelectContentServlet上,并带有一个参数id。
              (3)title.jsp的具体实现代码如下所示:
    
    
<%@ page language="java" contentType="text/html; charset=UTF-8" import = "java.util.*,entity.*"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<ol>
<% //获取News列表
List<News> list = (List<News>)request.getAttribute("list");
//循环获取信息
for(int i = 0 ;i<list.size();i++){
News news = list.get(i);
int new_id = news.getNew_id();
String new_title = news.getNew_title();
 
%>
//定义链接列表
<li><a href = "SelectContentServlet?id=<%=new_id %>"><%=new_title %></a></li>
 
<%} %>
</ol>
</body>
</html>
         6.SelectContentServlet
             (1)获取到该新闻的id
              (2)通过id获取到具体的新闻信息(通过NewsInter的实现类NewsImple中的getNews(int id)方法)
              (3)将具体内容传递到content.jsp 页面上
              (4)SelectContentServlet的具体实现代码如下:
    
    
package servlet;
 
import imple.NewsImple;
import inter.NewsInter;
 
import java.io.IOException;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import entity.News;
 
/**
* Servlet implementation class SelectServlet
*/
public class SelectContentServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SelectContentServlet() {
super();
// TODO Auto-generated constructor stub
}
 
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
 
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
 
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request,response);
}
 
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//定义编码方式
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//获取id值
int id = Integer.parseInt(request.getParameter("id"));
//获取具体的新闻信息
NewsInter n = new NewsImple();
News news = n.getNews(id);
request.setAttribute("news", news);
//将其显示在content.jsp页面上
request.getRequestDispatcher("content.jsp").forward(request, response);
}
 
}
         7.content.jsp
              (1)获取到具体新闻信息
               (2)定义需要在网页上现实的内容
              (3)图片的src写为要申请的GetResourceServlet,在这里我们可以通过图片的地址获取到图片信息,并,将它们显示在网页上。
              (4)content.jsp 的具体代码如下所示:
   
   
<%@ page language="java" contentType="text/html; charset=UTF-8" import = "entity.*"
pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName()
+":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
 
<%
//获取具体新闻信息
News news = (News)request.getAttribute("news");
 
String new_title = news.getNew_title();
String new_content = news.getNew_content();
 
String new_source = news.getNew_source();
int new_id = news.getNew_id();
%>
<%
//获取URL
String p = basePath + "GetResourceServlet?id="+new_id;
 
System.out.println(p);
%>
<!-- 具体内容显示 -->
<p align = "center">
<h1><%=new_title %></h1>
<%=new_content %><br/>
<%=new_source %><br/>
<img src = "<%=p%>">
</p>
</body>
</html>
         8.GetResourceServlet
              (1)获取新闻的id;
              (2)通过id获取图片的URL
              (3)读图片的URL,然后将图片写在网页上
              (4)GetResourceServlet 的具体代码如下所示:
    
    
package servlet;
 
import imple.NewsImple;
import inter.NewsInter;
 
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
* Servlet implementation class GetResourceServlet
*/
public class GetResourceServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public GetResourceServlet() {
super();
// TODO Auto-generated constructor stub
}
 
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request,response);
}
 
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//获取新闻的id
int id = Integer.parseInt(request.getParameter("id"));
//获取图片的URL
NewsInter n = new NewsImple();
String url = n.getImageUrl(id);
//读取图片信息
InputStream in = null;
OutputStream out = null;
in = new FileInputStream(url);
//byte要适量定义,不能太小
byte[] b = new byte[1024*1024*2];
out = response.getOutputStream();
int len = 0;
len=in.read(b);
System.out.println(len);
while(len != -1) {
//写图片信息
out.write(b,0,len);
out.flush();
out.close();
}
}
 
}
         9.该例中用来连接Oracle数据库的类DBConnection.java
              代码如下:
   
   
package databases;
 
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
 
public class DBConnection {
public static Connection getConnection(){
Connection con = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","scott");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
return con;
}
public static void close(ResultSet rs , CallableStatement call,Connection con){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(call != null){
try {
call.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
 
}
        10.实体类News
              具体代码:
              
   
   
package entity;
 
public class News {
private int new_id;
private String new_title;
private String image;
private String new_content;
private String new_source;
 
public String getNew_title() {
return new_title;
}
 
public void setNew_title(String new_title) {
this.new_title = new_title;
}
 
public String getNew_content() {
return new_content;
}
 
public void setNew_content(String new_content) {
this.new_content = new_content;
}
 
public String getNew_source() {
return new_source;
}
 
public void setNew_source(String new_source) {
this.new_source = new_source;
}
 
public int getNew_id() {
return new_id;
}
 
public void setNew_id(int new_id) {
this.new_id = new_id;
}
 
public String getImage() {
return image;
}
 
public void setImage(String image) {
this.image = image;
}
 
}
          11.接口类NewsInter
              具体代码:
    
    
package inter;
 
import java.util.List;
 
import entity.News;
 
public interface NewsInter {
public boolean addNews(News news);
public List<News> getAllNews();
public String getImageUrl(int id);
public News getNews(int id);
 
}
         12.实现类NewsImple
         具体代码:
   
   
package imple;
 
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
 
import oracle.jdbc.internal.OracleTypes;
import databases.DBConnection;
import entity.News;
import inter.NewsInter;
/**
*
* @author lenovo
*NewsInter的实现类,在这里,我们对News进行各种操作
*/
 
public class NewsImple implements NewsInter{
/*
* (non-Javadoc)
* @see inter.NewsInter#addNews(entity.News)
* 实现对news的添加功能,我们将录入的新闻信息添加到数据库中。
*/
@Override
public boolean addNews(News news) {
//创建Connection
Connection con = null;
//创建CallableStatement
CallableStatement call = null;
//获取新闻信息
String new_title = news.getNew_title();
String new_content = news.getNew_content();
String new_source = news.getNew_source();
String new_image = news.getImage();
//定义sql语句
String sql = "{call news_package.addNews(news_seq.nextval(),?,?,?,?,?)}";
//连接数据库
con = DBConnection.getConnection();
try {
//发送sql语句
call = con.prepareCall(sql);
//为占位符设置值
call.setString(1, new_title);
call.setString(2, new_content);
call.setString(3, new_source);
call.setString(4, new_image);
call.registerOutParameter(5, OracleTypes.VARCHAR);
//执行sql语句
call.execute();
//获取是否添加成功的信息
String rs = call.getString(5);
if(rs.equals("添加成功") ){
return true;
}else{
return false;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBConnection.close(null, call, con);
}
return false;
}
/*
* (non-Javadoc)
* @see inter.NewsInter#getAllNews()
*
* 获取所有新闻信息
*/
@Override
public List<News> getAllNews() {
//创建Connection
Connection con = null;
//创建CallableStatement
CallableStatement call = null;
//创建ResultSet
ResultSet rs = null;
//创建新闻列表
List<News> list = new ArrayList<News>();
//定义sql语句
String sql = "{call news_package.selectNews(?)}";
//连接数据库
con = DBConnection.getConnection();
try {
//发送sql语句
call = con.prepareCall(sql);
//为占位符赋值
call.registerOutParameter(1, OracleTypes.CURSOR);
//执行sql语句
call.execute();
//获取结果集
rs = (ResultSet)call.getObject(1);
//循环获得新闻信息,并加入列表中
while(rs.next()){
News news = new News();
news.setNew_id(rs.getInt("new_id"));
news.setNew_title(rs.getString("new_title"));
news.setNew_content(rs.getString("new_content"));
news.setNew_source(rs.getString("new_source"));
news.setImage(rs.getString("new_image"));
list.add(news);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBConnection.close(rs, call, con);
}
//返回列表
return list;
}
/*
* (non-Javadoc)
* @see inter.NewsInter#getImageUrl(int)
*
* 获取图片的URL路径
*/
public String getImageUrl(int id){
//创建Connection
Connection con = null;
//创建CallableStatement
CallableStatement call = null;
//创建rs
String rs = null;
//定义sql语句
String sql = "{call news_package.getImageUrl(?,?)}";
//连接数据库
con = DBConnection.getConnection();
try {
//发送sql语句
call = con.prepareCall(sql);
//为占位符赋值
call.setInt(1, id);
call.registerOutParameter(2, OracleTypes.VARCHAR);
//执行sql语句
call.execute();
//获取Url
rs = call.getString(2);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
/*
* (non-Javadoc)
* @see inter.NewsInter#getNews(int)
* 获取新闻具体信息
*
*/
@Override
public News getNews(int id) {
//创建Connection
Connection con = null;
//创建CallableStatement
CallableStatement call = null;
//创建ResultSet
ResultSet rs = null;
//创建新闻对象
News news = null;
//定义sql语句
String sql = "{call news_package.selectNewsInfo(?,?)}";
//连接数据库
con = DBConnection.getConnection();
try {
//发送sql语句
call = con.prepareCall(sql);
//为占位符赋值
call.setInt(1, id);
call.registerOutParameter(2, OracleTypes.CURSOR);
//执行sql语句
call.execute();
//获取结果集
rs = (ResultSet)call.getObject(2);
//获取新闻对象并为它赋值
if(rs.next()){
news = new News();
news.setNew_id(id);
news.setImage(rs.getString("new_image"));
news.setNew_content(rs.getString("new_content"));
news.setNew_source(rs.getString("new_source"));
news.setNew_title(rs.getString("new_title"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return news;
}
 
}
         13.该例中用到的Sql语句如下:
   
   
 
--建表News
create table news(
new_id number primary key,
new_title varchar2(20),
new_source varchar2(20),
new_content varchar2(20),
new_image varchar2(100)
);
--建序列news_seq
create sequence news_seq start with 1 increment by 1 nocycle nocache nomaxvalue;
 
--建包news_package
create or replace package news_package
as
type new_sur is ref cursor;
type info_sur is ref cursor;
procedure addNews(id in number,title in varchar2,content in varchar2,source in varchar2,image in varchar2,rs out varchar2);
procedure selectNews(all_news out new_sur);
procedure getImageUrl(id in number,url out varchar2);
procedure selectNewsInfo(id in number,news_info out info_sur);
end news_package;
--建包体news_package
create or replace package body news_package as
procedure addNews(id in number,title in varchar2,content in varchar2,
source in varchar2,image in varchar2,rs out varchar2)
as
begin
insert into news(new_id,new_title,new_content,new_source,new_image)
values(id,title,content,source,image);
commit;
rs := '添加成功';
Exception
when others then rs := '添加失败';
end addNews;
procedure selectNews(all_news out new_sur)
as
begin
open all_news for
select new_id ,new_title,new_content,new_source,new_image
from news order by new_id;
end selectNews;
procedure getImageUrl(id in number,url out varchar2)
as
begin
select new_image into url from news where new_id = id;
end getImageUrl;
procedure selectNewsInfo(id in number,news_info out info_sur)
as
begin
open news_info for
select new_title,new_content,new_source,new_image
from news where new_id = id;
end selectNewsInfo;
end news_package;
这样,一个完整的从上传到显示就完成了。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值