Day48
*在昨天的注册案例上加一个功能:用户注册之后,给用户返回一个html页面,告知用户注册成功,且有用户的所有信息(必须是中文)
I. 如果需要有中文,那么中文乱码问题肯定是要考虑的;所以,这里将请求时的数据和响应时的数据编码统一改为utf-8
//这个放在所有请求的逻辑代码的前面
req.setCharacterEncoding("utf-8");
//这个放在所有响应的逻辑代码的前面
resp.setContentType("text/html;charset=utf-8");
II. 从数据库中将数据取出来(数据库中需要设置用户名为主键),并封装到UserInfo这个实体类中
//rs为查询到的结果集
if (rs.next()) {
userInfo.setUsername(rs.getString("username"));
userInfo.setPassword(rs.getString("password"));
userInfo.setGraduation(rs.getString("graduation"));
userInfo.setSex(rs.getString("sex"));
userInfo.setProfile(rs.getString("profile"));
userInfo.setInterests(rs.getString("interests").split(","));
}else{
return null;
}
return userInfo;
III. 对这个实体类的属性进行处理(将某些值转换成中文)
private UserInfo responseInfo(String username){
UserInfo userInfo = selectInfo(username);
userInfo.setSex("male".equals(userInfo.getSex())? "男":"女");
String[] interests = userInfo.getInterests();
for (int i = 0; i < interests.length; i++){
switch (interests[i]){
case "sport":
interests[i] = "运动";break;
case "game":
interests[i] = "打游戏";break;
case "read":
interests[i] = "阅读";break;
}
}
userInfo.setInterests(interests);
switch (userInfo.getGraduation()){
case "gz":
userInfo.setGraduation("高中");break;
case "dz":
userInfo.setGraduation("大专");break;
case "bk":
userInfo.setGraduation("本科");break;
case "ss":
userInfo.setGraduation("硕士");break;
}
return userInfo;
}
IV. 最后用输出流给前面返回这些信息。
String[] str = userInfo.getInterests();
StringBuilder str_Interests = new StringBuilder();
for (int i = 0; i < str.length; i++){
str_Interests.append(str[i]+" ");
}
String html = "<html><body><h1>注册成功</h1><p>用户名:"+userInfo.getUsername()+
"</p><p>密码:" +userInfo.getPassword()+
"</p><p>性别:" +userInfo.getSex()+
"</p><p>兴趣:" +str_Interests.toString()+
"</p><p>学历:" +userInfo.getGraduation()+
"</p><p>个人简介:" +userInfo.getProfile()+
"</p></body><html>";
PrintWriter writer = resp.getWriter();
writer.write(html);
writer.flush();
writer.close();
*Nginx服务器:
*上传文件:
I. 写一个上传文件的前端表单
<!-- 1.文件的上传必须是post,因为它的数据是放在请求体中的,可以携带大量的数据
2.enctype必须是:多媒体的表单数据(multipart/form-data)
-->
<form method="post" enctype="multipart/form-data" action="file">
File: <input type="file" name="avatar"><br>
<input type="submit" value="提交">
</form>
II. 自定义一个servlet类,处理post请求
/**
* 1.数据库中不允许存放图片,只能存文件的名字
* 2.文件的上传必须使用post请求,因为get请求的数据是在url地址栏上,但是url
* 地址能够携带的数据大小是有限制的(只有几KB),而post请求的信息是存在放在请求体中的,可以携带大量数据。
* 3.文件的上传必须得指定 MultipartConfig,意思是:使用该servlet来处理多媒体的表单数据
*/
@WebServlet(value = "/file",name = "FileServlet")
@MultipartConfig
public class FileServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
III. 使用part对象接收用户上传文件的所有信息
//这里是因为文件名可能为中文
req.setCharacterEncoding("utf-8");
//获取到上传文件的所有信息,并封装在一个part对象中
Part part = req.getPart("avatar");
IV. 获取文件名
//获取文件名,文件名是在part的头部,"content-disposition"中存储有文件名
String s = part.getHeader("content-disposition");
//这里获取到的值:form-data; name="avatar"; filename="文件名"
//接下来需要从这个字符串中拿到文件名
String str = "filename=\"";
int index = s.indexOf(str)+str.length();//此时,index就能定位到文件名的第一个字符
//在使用substring方法截取到最后一个”之前,就可以得到完整的文件名
String fileName = s.substring(index,s.length()-1);
V. 使用输入和输出流,将文件保存到硬盘中
//使用输入流接收文件
InputStream is = part.getInputStream();
//在使用输出流将文件保存在本地硬盘中
OutputStream os = new FileOutputStream("D:\\Users\\t\\nginx-1.17.2\\html\\"+fileName);
//写一个1kb的缓冲数组
byte[] buffered = new byte[1024];
int i = -1;
/*i默认值为-1,is.read(buffered)是将文件读取到buffered中,并返回读取到的长度
* 如果长度不等于-1 则代表读取到了数据,反之则没有读取到,也就是读取完毕了
* 那么就结束循环
* */
while ((i = is.read(buffered)) != -1){
//这里需要设置起始位置和结束位置
//因为最后一次读取不一定能有1024个长度
os.write(buffered,0,i);
os.flush();
}
is.close();
os.close();