看eclipse

1.用户注册功能

1.1用户注册

思路分析:

1、使用表单收集用户输入的数据(form)

2、点立即注册提交表单

  • type=submit时可以提交表单
  • 使用js方式 ```html
    立即注册

  1. **在Servlet中如何处理不同的功能请求?**
  2. 注意:以后的请求都要加上method参数名
  3. ```java
  4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5. //获取method的参数值
  6. String method = request.getParameter("method");
  7. if("checkUsername".equals(method)) {
  8. //调用校验用户名方法
  9. this.checkUsername(request, response);
  10. }else if("register".equals(method)) {
  11. //调用注册方法
  12. this.register(request, response);
  13. }
  14. }

register表单

  1. <form action="UserServlet?method=register" id="f4" method="post">

3、在UserServlet中获取表单的数据

原先的方式:

  1. //1、获取表单数据
  2. String name = request.getParameter("name");
  3. String sex = request.getParameter("sex");
  4. String ph = request.getParameter("phone");
  5. String xx = request.getParameter("xxx");
  6. String yy = request.getParameter("yy");
  7. String zz = request.getParameter("zz");
  8. ...

存在的问题:当提交的参数有多个时,光获取参数的代码就要写很多行

4、将获取到的数据作为方法的参数传到service层

  1. //2、调用service 将参数传给sercie
  2. UserService us = new UserService();
  3. us.register(name,sex,ph,xx,yy,zz);

存在的问题:当数据很多时,方法的参数要传很多个,传参时很容易错乱、发生问题

以下代码可以解决以上两个存在的问题:

  1. Map<String, String[]> map = request.getParameterMap();
  2. /*
  3. getParameterMap():获取参数列表中所有的参数名和参数值
  4. String:参数名
  5. String[]:参数值
  6. */
  7. //注册方法
  8. protected void register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9. try {
  10. //获取表单中的数据
  11. Map<String, String[]> map = request.getParameterMap();
  12. //创建User对象
  13. User user = new User();
  14. //BeanUtils工具类(将map中的数据封装到User对象中)
  15. BeanUtils.populate(user, map);
  16. //调用service层
  17. UserService us = new UserService();
  18. us.register(user);
  19. } catch (IllegalAccessException | InvocationTargetException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. }
  23. }

5、service将user对象传到dao层

  1. //调用service层
  2. UserService us = new UserService();
  3. us.register(user);
  4. public class UserService {
  5. UserDao ud = new UserDao();
  6. public void register(User user) {
  7. ud.register(user);
  8. }
  9. }

6、在dao层使用dbutils写sql

  1. public class UserDao {
  2. QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
  3. public void register(User user) {
  4. String sql = "insert into user values(?,?,?,?,?,?,?,?,?,?)";
  5. Object [] param = {null,user.getName(),user.getSex(),user.getPhone_number(),user.getArea(),
  6. user.getManager(),user.getUsername(),user.getPassword(),user.getPhoto(),null};
  7. try {
  8. qr.update(sql, param);
  9. } catch (SQLException e) {
  10. // TODO Auto-generated catch block
  11. e.printStackTrace();
  12. }
  13. }
  14. }

7、跳转到登录页面(待完善)

  1. //Servlet
  2. //跳转到登录页面
  3. response.getWriter().write("<h1>注册成功,3秒后跳转到登录页面!!<h1>");
  4. response.setHeader("refresh", "3;url=/dami/login.jsp");

1.2功能完善:验证用户名唯一

ajax如何使用呢

register.jsp

onblur事件:

  1. <tr>
  2. <td width="25%" class="_left">用户名:</td>
  3. <td><input type="text" id="username" name="username" onblur="checkUsername(this.value)" ><span id="s_username"></span></td>
  4. </tr>

UserServlet:

  1. protected void checkUsername(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
  2. String username=request.getParameter("username");
  3. UserService us=new UserService();
  4. User user =us.checkUsername(username);
  5. String msg = "";
  6. //判断
  7. if(user == null) {
  8. //用户名不存在 该用户名可用
  9. msg = "true";
  10. }else {
  11. //用户名存在,该用户名不可以使用
  12. msg = "false";
  13. }
  14. //以流的形式将msg响应过去
  15. response.getWriter().write(msg);
  16. }

register.jsp

  1. function checkUsername(username) {
  2. var url="UserServlet";
  3. var data ={"username":username,"method":"checkUsername"};
  4. $.post(url,data,function(msg){
  5. //选中id为s_username的元素对象!!!!!!!!!!!!!!!!!!!
  6. var user = $("#s_username");
  7. //函数体
  8. if(msg == "true"){
  9. //用户名可用,增加内容提
  10. user.html("<font color='green'>用户名可以使用!!</font>");
  11. }else{
  12. //用户名已被占用
  13. user.html("<font color='red'>用户名已被占用,清更换一个!!</font>");
  14. }
  15. })
  16. }

image.png

1.3、头像上传

IO流文件的复制:

image.png

文件上传、下载简略图:

image.png

问题1:get和post的区别?

get:提交的数据在地址栏上,提交的数据量有限 (大概最多是2kb左右)

post: 提交的数据在请求体中,一般来说无上限

思考:做文件上传应该采用get还是post?

  1. 使用post方式

文件上传:

浏览器的步骤

  • type的值必须为file
  • 请求方式必须为post
  • 将form的属性enctype的值设置为multipart/form-data

默认提交的数据是键值对的形式:

image.png

设置multipart/form-data之后提交的数据形式:以二进制的形式

image.png

问题2:multipart/form-data设置之后,在Servlet中根据method获取的值变为null?

  1. 原因就是因为改变了数据的提交形式

服务器端的步骤:

  • 在Servlet上加该注解@MultipartConfig:支持文件上传
    作用:可以获取除了type=file类型的input里的参数名和值

问题3:加上该注解后,根据photo参数名获取的值为null

  • 如果想获取文件的信息,我们要使用
    1. Part part = request.getPart("photo");

    问题4:上传文件到指定路径part.write(path+”\“+图片的名称);

    如何获取上传图片的名称?

并上传到指定的地方

  1. //获取图片信息,封装到Part对象
  2. Part part = request.getPart("photo");
  3. //获取上传的图片名称
  4. //Content-Disposition: form-data; name="photo"; filename="wukong.png"
  5. String str = part.getHeader("Content-Disposition");
  6. String filename = str.substring(str.indexOf("filename")+10, str.length()-1);
  7. //调用write上传到指定的位置
  8. String path = "D:\\xm_upload";
  9. part.write(path+"\\"+filename);
  1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593791579597-e29a03e3-1120-434a-930b-12d2747a2fcc.png#crop=0&crop=0&crop=1&crop=1&height=238&id=sfLcS&margin=%5Bobject%20Object%5D&name=image.png&originHeight=354&originWidth=849&originalType=binary&ratio=1&rotation=0&showTitle=false&size=181462&status=done&style=none&title=&width=570)<br />**问题5:当头像名称相同时,会将之前的头像给覆盖了**<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1238082/1593794433625-afd0a751-6135-453c-9721-996dcf69427b.png#crop=0&crop=0&crop=1&crop=1&height=48&id=e5n0M&margin=%5Bobject%20Object%5D&name=image.png&originHeight=96&originWidth=244&originalType=binary&ratio=1&rotation=0&showTitle=false&size=3704&status=done&style=none&title=&width=122)
  1. public class UUIDUtils {
  2. public static String getUUID() {
  3. return UUID.randomUUID().toString().replaceAll("-", "");
  4. }
  5. }
  6. filename = UUIDUtils.getUUID()+filename;

image.png

问题6:如何通过服务器访问到指定上传图片位置的图片?

双击tomcat—-》选中Modules

image.png
image.png
image.png
image.png

问题7:user表中的photo字段存什么值呢?

  1. filename就可以
  1. //设置photo属性值
  2. user.setPhoto(filename);

4、手机验证码登录

4.1 向手机发送验证码

思路分析:

image.png

代码实现:

login.jsp

  1. <input onclick="sendCode()" id="zphone" type="button" value=" 获取手机验证码 " style="width: 138px;float: left;height: 53px;margin-left: 5px;">
  2. //发送验证码
  3. function sendCode(){
  4. //获取输入手机号的值
  5. var val = $("#phone_number").val();
  6. $.post("/dami/user",{method:"sendCode","phoneNumber":val},function(){
  7. })
  8. RemainTime();
  9. }

Servlet:

注意:不要忘了加if else判断

  1. //发送验证码
  2. protected void sendCode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. //获取手机号
  4. String phoneNumber = request.getParameter("phoneNumber");
  5. //真实环境中 调用阿里云相关的api
  6. //Ali.sendCode(phoneNumber);
  7. //模拟环境
  8. String code = RandomUtils.getFourRandom();
  9. System.out.println("您收到的验证码为:"+code+",五分钟内有效,千万不要泄露喔!!!");
  10. }

4.2 手机验证码登录

login.jsp

  1. <span id="sub" onclick="login()">登录</span>
  2. function login(){
  3. //获取输入手机号的值
  4. var val = $("#phone_number").val();
  5. //获取输入验证码的值
  6. var code = $("#code").val();
  7. //向服务器传递数据
  8. $.post("/dami/user",{"method":"login","phoneNumber":val,"code":code},function(msg){
  9. if(msg == "0"){
  10. $("#msg").html("该手机号尚未注册,请先去注册");
  11. }else if(msg =="2"){
  12. $("#msg").html("验证码输入错误")
  13. }else if(msg == "1"){
  14. alert("登录成功!!!!");
  15. }
  16. })
  17. }

Servlet:

  1. //登录
  2. protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. //获取手机号
  4. String phoneNumber = request.getParameter("phoneNumber");
  5. //获取验证码
  6. String code = request.getParameter("code");
  7. //1、判断手机号是否注册
  8. UserService us = new UserService();
  9. User user = us.checkPhoneNumber(phoneNumber);
  10. String msg = "";
  11. if(user != null) {
  12. //手机号已经存在 可以登录
  13. //判断验证码是否正确
  14. String sessionCode = (String) request.getSession().getAttribute("code");
  15. if((phoneNumber + code).equals(sessionCode)) {
  16. //验证码正确
  17. msg = "1";
  18. }else {
  19. //验证码错误
  20. msg = "2";
  21. }
  22. }else {
  23. //手机不存在 不能登录
  24. msg = "0";
  25. }
  26. response.getWriter().write(msg);
  27. }

注意:需要同时在sendCode中加以下的代码:

  1. request.getSession().setAttribute("code", phoneNumber+code);

Service:

  1. public User checkPhoneNumber(String phoneNumber) {
  2. // TODO Auto-generated method stub
  3. return ud.checkPhoneNumber(phoneNumber);
  4. }

Dao:

  1. public User checkPhoneNumber(String phoneNumber) {
  2. //1、准备sql
  3. String sql = "SELECT * FROM USER WHERE phone_number = ?";
  4. //2、给占位符复制
  5. Object [] param = {phoneNumber};
  6. //3、执行sql
  7. try {
  8. User user = qr.query(sql, new BeanHandler<User>(User.class),param);
  9. return user;
  10. } catch (SQLException e) {
  11. // TODO Auto-generated catch block
  12. e.printStackTrace();
  13. }
  14. return null;
  15. }

image.png