Web前端01

 <h1-h6>:标题,<h1>是一级标题 <h2>是二级标题,最多到6级标题
              标题独占一行
      <center>:现在已经不再建议使用这个标签了,后期都是使用CSS控制页面中的组件位置
               该标签可以让包含在它之内的组件居中显示

      <input>:输入组件,组件的样式由属性type决定
              type常见的值:
              text:文本框
              password:密码框
              button:按钮
              submit:提交按钮(表单使用)

              radio:单选框           单选框与复选框需要使用name属性分组,
              checkbox:复选框        名字相同的为一组,尤其单选框,一组的才会互斥

      <a>:超链接,标签中间的文本就是超链接上提示的文字,href属性用于指定点击超链接后
                跳转的路径。

      <br>:换行

      <table>:表格。属性border用于指定边框。
                    <table>标签中包含<tr>标签用于表示行
                    <tr>标签中包含<td>标签用于表示列
                    <td>标签中常见属性:
                    align:对其方式。left左对齐,right右对齐,center剧中对其
                    colspan:跨列合并列,合并是从左向右合并列
                    rowspan:跨行合并列,合并是从上向下合并列
  
    form 表单
    表单组件用于将用户在页面上输入的内容提交给服务端使用
    所有输入组件只有包含在form标签的范围内才会被表单提交,这一点要十分注意!!!

    表单有两个重要的属性:
    action:用来指定表单提交的路径
    method:用来指定表单提交的方式
           提交方式有两种:
           GET:将所有输入组件中用户输入的信息拼接到URL的资源抽象路径部分直接提交
           POST:将所有信息放在请求的消息正文中打包传递
                当表单中含有用户隐私信息或包含附件时应当使用POST形式提交
           若form中不指定method,默认的提交方式为GET

当下面的表单使用GET形式提交时,所有输入框中的内容会被拼接到URL的资源抽象路径中提交
资源抽象路径部分的"?"左侧内容为表单action指定的路径,表示表单提交的位置
"?"右侧则是提交表单时附带的用户输入的需要提交的信息,格式为:
输入框名字1=用户输入的信息&输入框名字2=用户输入信息&....

–>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
</head>
<body>
<center>
    <h1>用户注册</h1>
    

    <form action="/regUser" method="get">
        <table border="1">
            <tr>
                <td>用户名</td>
                    <!-- 在form表单中的输入组件都要使用name属性指定名字,否则表单提交时会忽略这个组件的值 -->
                <td><input name="username" type="text"></td>
            </tr>
            <tr>
                <td>密码</td>
                <td><input name="password" type="password"></td>
            </tr>
            <tr>
                <td>昵称</td>
                <td><input name="nickname" type="text"></td>
            </tr>
            <tr>
                <td>年龄</td>
                <td><input name="age" type="number"></td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <!--
                        表单提交的专属按钮,类型为submit
                        点击该按钮后会将包含这个按钮的表单按照其action指定的位置提交
                     -->
                    <input type="submit" value="注册">
                </td>
            </tr>
        </table>
    </form>
</center>
</body>
</html>
    在reg.html页面上点击注册按钮,测试是否可以调用到当前reg方法.
    如果点击后页面上是"大白板"就说明对了,如果报错404则说明错误了.
    错误的原因可3是:
    1:浏览器上请求reg.html页面时,端口号是否为8080,不能使用63342这个端口!
      63342端口相当于是本地打开页面,不走我们的服务器
    2:当前UserController类所在的包controller是否与启动类在同一个包里
      SpringBoot的要求是必须放在与启动类SpringBoot2302Application所在同一个包中
    3:UserController类上是否添加了注解@Controller
      reg方法上是否添加了注解@RequestMapping,并且注解中传入的参数是否与reg.html页面
      上form表单中action的值相同.不仅相同,径路是否都是从"/"开始的.
      比如"/regUser"
    4:修改后服务器是否重启?浏览器是否重新刷新了?每次修改java代码后服务器要重启.每次修改了
      网页后不仅要重启服务器,浏览器也要刷新才可以.
 */

HttpServletRequest称为请求对象,内容表达的是浏览器发送过来的所有数据
HttpServletResponse称为响应对象,内容表达的是我们处理完业务后给浏览器回复的内容

        处理业务的大致过程:
        1:通过请求对象获取浏览器发送过来的信息(比如表单中用户输入的注册信息)
        2:通过获取的信息进行响应的业务处理
        3:通过设置响应对象将处理结果回馈给浏览器
     */
package com.tedu.springboot2302.controller;

import com.tedu.springboot2302.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

/**
 * 当前类用于处理与用户相关的业务操作
 */
@Controller
public class UserController {
    private static File userDir;

    static {
        userDir = new File("./users");
        if (!userDir.exists()) {
            userDir.mkdirs();
        }
    }
    @RequestMapping("/regUser")
    public void reg(HttpServletRequest request, HttpServletResponse response) {
        /*
            HttpServletRequest称为请求对象,内容表达的是浏览器发送过来的所有数据
            HttpServletResponse称为响应对象,内容表达的是我们处理完业务后给浏览器回复的内容

            处理业务的大致过程:
            1:通过请求对象获取浏览器发送过来的信息(比如表单中用户输入的注册信息)
            2:通过获取的信息进行响应的业务处理
            3:通过设置响应对象将处理结果回馈给浏览器
         */
        System.out.println("开始处理用户注册!!!!!!!!!!!!!!!");
        //获取表单提交的信息
        /*
            getParameter中的参数要与页面上表单中对应输入框的名字一致
            例如:
             String username = request.getParameter("username");
                                                     ^^^^^^^^
             应当对应的是reg.html页面上
             <input type="text" name="username">
                                      ^^^^^^^^
         */
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String nickname = request.getParameter("nickname");
        String ageStr = request.getParameter("age");
        /*
            获取参数后,可能出现的情况:
            1:与输入框中输入的信息一致,则是正常的
            2:如果是空字符串,说明页面上该输入框没有输入信息
            3:如果是null,说明没有获取到这个参数,原因:
              getParameter()中的参数与页面上对应输入框name属性的值不一致导致.
         */
        System.out.println(username + "," + password + "," + nickname + "," + ageStr);

        //对浏览器提交的数据进行必要的验证
        if (username == null || username.isEmpty() ||
                password == null || password.isEmpty() ||
                nickname == null || nickname.isEmpty() ||
                ageStr == null || ageStr.isEmpty() ||
                !ageStr.matches("[0-9]+")) {
            //直接给用于响应一个错误的提示页面
            try {
                response.sendRedirect("/reg_info_error.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }


        //验证通过后,就要将该用户信息保存在服务端
        /*
            将用户提交的注册信息以User实例形式表示.
            然后将该User实例序列化到文件中做长久保存.
         */
        int age = Integer.parseInt(ageStr);
        User user = new User(username, password, nickname, age);
//        File file = new File("./users/"+username+".obj");
        //第一个参数的File对象表示当前文件在哪个目录中
        File file = new File(userDir, username + ".obj");

        //首先判断该文件是否已经存在了,存在则说明此为重复用户
        if (file.exists()) {
            try {
                response.sendRedirect("/have_user.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }


        try (
                FileOutputStream fos = new FileOutputStream(file);
                ObjectOutputStream oos = new ObjectOutputStream(fos);
        ) {
            oos.writeObject(user);

            response.sendRedirect("/reg_success.html");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping("/loginUser")
    public void login(HttpServletRequest request,HttpServletResponse response){
        System.out.println("开始处理用户登录");
        //1获取表单信息
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //必要的验证
        if(username==null||username.isEmpty()||
           password==null||password.isEmpty()){
            try {
                response.sendRedirect("/login_info_error.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }

        //用当前登录用户的用户名去users目录下找他的注册信息
        File file = new File(userDir,username+".obj");
        if(file.exists()){//文件存在则说明该用户注册过
            //反序列化该文件并得到曾经该用户的注册信息
            try (
                    FileInputStream fis = new FileInputStream(file);
                    ObjectInputStream ois = new ObjectInputStream(fis);
            ){
                //从文件中反序列化回来的对象,应当是上面reg方法曾经保存的该用户的注册信息
                User user = (User)ois.readObject();
                //比较注册时输入的密码与本次登录时输入的密码是否一致
                if(user.getPassword().equals(password)){
                    //密码一致则表示登录成功
                    response.sendRedirect("/login_success.html");
                }else{
                    //登录失败
                    response.sendRedirect("/login_fail.html");
                }
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }


        }else{//文件不存在说明这不是一个注册用户
            try {
                response.sendRedirect("/login_fail.html");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

meta标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- 3秒钟后跳转url指定的路径 -->
    <meta http-equiv="refresh" content="3;url=/login.html">
    <title>登录失败</title>
</head>
<body>
  <center>
    <h1>登录失败,用户名或密码不正确,<a href="/index.html">重新登录</a></h1>
    3秒后自动跳转登录页面
  </center>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值