学习Java的日子 Day57 Tomcat,Serlvet,注册功能

Day57

1.初识Javaweb

1.1 什么是web开发

WEB,即网页的意思,它用于表示Internet主机上供外界访问的资源。

Internet上供外界访问的Web资源分为:

静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变。

动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同,在Java中,动态web资源开发技术统称为Javaweb

1.2 Web容器_Tomcat

Web服务器:负责解析 HTTP 协议,解析请求数据,并发送响应数据

浏览器按照HTTP协议发送请求和数据,后台就需要一个Web服务器软件来根据HTTP协议解析请求和数据,然后把处理结果再按照HTTP协议发送给浏览器

1.3 JavaWeb应用程序

Web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射
(1)Request是从客户端向服务端发出的请求对象,

(2)Response是从服务端响应给客户端的响应对象,

(3)JSP是动态网页技术,

(4)会话技术是用来存储客户端和服务端交互所产生的数据,

(5)过滤器是用来拦截客户端的请求,

(6)监听器是用来监听特定事件,

(7)Ajax、Vue、ElementUI都是属于前端技术

1.4 Web应用的组成结构

开发web应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错

2.编写一个web项目

1.添加web项目框架

3.上面2中右下角报黄色警告,直接点击,结跳转到这个页面

4.项目结构,html文件在web里建,Java代码在src中建

5.写完代码,配置Tomcat服务器

7.Fix修复一下

8.运行,结束
项目框架

在web里建一个Welcome的HTML文件

java 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 导入css代码-->
    <link rel="stylesheet" type="text/css" href="css/imgstyle.css">
    
</head>
<body>

    <H1>欢迎页面</H1>
    <img src="img/a.jfif">

</body>
</html>

编写css代码

css 复制代码
img{
    width:100px;
    height: 100px;
    border-radius: 50%;
}

运行结果:

注意:需要自己手动输出Welcome.html
将某个网页设置网站默认访问的首页

WEB-INF下的web.xml中编写以下代码

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <welcome-file-list>
        <welcome-file>Weclome.html</welcome-file>
    </welcome-file-list>
    
</web-app>

3.Servlet 上

3.1 什么是Servlet

Servlet是sun公司提供的一门用于开发动态web资源的技术,可以实现和客户端的交互,接收客户端****请求*和给客户端返回*响应****。
Sun公司在其API中提供了一个Servlet接口

3.2 Servlet的实现类

Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、*HttpServlet*
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,重写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要重写doGet或doPost方法,而不要去重写service方法
注意:Servlet是一个接口,GenericServlet实现了Servlet接口,HttpServlet在继承了GenericServlet

3.3 案例:编写注册页面

新建数据库user表

注意:是name,而不是username

添加数据

在Welcome.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 导入css代码-->
    <link rel="stylesheet" type="text/css" href="css/imgstyle.css">

</head>
<body>

    <H1>欢迎页面</H1>
    <img src="img/a.jfif"> <br/>

    <a href="login.html">登录</a>
    <a href="register.html">注册</a>

</body>
</html>

register.html

表单里必须写name属性,才能传给服务器

前端传给后端的数据都是字符串 string

java 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>

<h1>注册页面</h1>

<form action="#" method="post">

    账号:<input type="text" name="username"/>  <br/>
    密码:<input type="text" name="password"/>  <br/>
    昵称:<input type="text" name="nickName"/>  <br/>
    年龄:<input type="text" name="age"/>  <br/>
    性别:
    <input type="radio" name="sex" value="man" checked="checked">男
    <input type="radio" name="sex" value="woman" >女
    <br/>
    爱好:
    <input type="checkbox" name="hobbies" value="football">足球
    <input type="checkbox" name="hobbies" value="basketball">篮球
    <input type="checkbox" name="hobbies" value="shop">购物
    <br/>

    <input type="submit" value="注册"><br>
    <input type="button" value="返回" onclick="goWeclome()"/>
</form>

<script type="text/javascript">
    function goWeclome(){
        window.location="Welcome.html";
    }
</script>
</body>
</html>

login.html(先不写)

java 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登录页面</h1>

</body>
</html>

运行一下

将Druids连接池导入到项目中,后续要操作数据库
项目结构

在Servlet包中建一个RegisterServlet的java文件

记得导servlet包,然后在项目结构操作一下

java 复制代码
public class RegisterServlet extends HttpServlet {

    /**
     * 客户端发送请求给该Servlet,就会触发service()
     * @param req 请求对象
     * @param resp 响应对象
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("好好学习");
    }
}

在web.xml编写前端后端到路径

xml 复制代码
	<servlet>
        <servlet-name>RegisterServlet</servlet-name>
        <servlet-class>com.qf.Servlet.RegisterServlet</servlet-class> <!-- 全限类名 -->
    </servlet>

    <servlet-mapping>
        <servlet-name>RegisterServlet</servlet-name>
        <url-pattern>/register</url-pattern> <!-- 要加上/,前端不加/ -->
    </servlet-mapping>

将注册页面服务器路径改成register,不要加/;在web.xml中要加/

根据左边的项目结构,分析web.xml中的代码

Servlet理解图:

在RegisterServlet中获取前端的name属性

hobbies特殊,因为是多选框,拿到的是多个值,用数组存储

java 复制代码
public class RegisterServlet extends HttpServlet {

    /**
     * 客户端发送请求给该Servlet,就会触发service()
     * @param req 请求对象
     * @param resp 响应对象
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置编码格式
        req.setCharacterEncoding("UTF-8");//设置请求编码格式

//        //获取请求中的数据 -- 方式一
//        String name = req.getParameter("username"); 
//        String password = req.getParameter("password");
//        String nickName = req.getParameter("nickName");
//        String sex = req.getParameter("sex");
//        String age = req.getParameter("age");
//        String[] hobbies = req.getParameterValues("hobbies");
//
//        System.out.println(name);
//        System.out.println(password);
//        System.out.println(nickName);
//        System.out.println(sex);
//        System.out.println(age);
//        System.out.println(Arrays.toString(hobbies));


        //获取请求中的数据 -- 方式二   用这个
        Map<String, String[]> parameterMap = req.getParameterMap();//获取映射对象
        Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
        for (Map.Entry<String, String[]> entry:entries){
            System.out.println(entry.getKey()+"--"+Arrays.toString(entry.getValue()));
        }

    }
}

方式一:

方式二:

封装student实体类

java 复制代码
package com.qf.pojo;

public class User {

    private String username;
    private String password;
    private String nickName;
    private String sex;
    private int age;
    private String hobbies;

   //无参构造,有参构造,get,set,toString方法省略
}

注册页面代码
注意:

sql语句中的不是username,而是name

要设置编码格式

java 复制代码
public class RegisterServlet extends HttpServlet {

    /**
     * 客户端发送请求给该Servlet,就会触发service()
     * @param req 请求对象
     * @param resp 响应对象
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置编码格式
        req.setCharacterEncoding("UTF-8");//设置请求编码格式
        resp.setContentType("text/html;charset=UTF-8");//设置响应编码格式

        //获取请求中的数据 -- 方式一
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String nickName = req.getParameter("nickName");
        String sex = req.getParameter("sex");
        String age = req.getParameter("age");
        String[] hobbies = req.getParameterValues("hobbies");

        try {
            User user = DBUtil.commonQueryObj(User.class, "select * from user where name=?", username); //获取提交查询对象

            if (user==null){//允许注册

                //hobbies是数组,拼接字符串
                StringBuffer sb = new StringBuffer();
                for (String hobby:hobbies){
                    if(sb.length() != 0){
                        sb.append(",");
                    }
                   sb.append(hobby);
                }
                
                //注册成功,将数据添加到数据库中
                DBUtil.commonUpdate("insert into user(name,password,nickName,sex,age,hobbies) values(?,?,?,?,?,?)",username,password,nickName,sex,age,sb.toString());

                resp.getWriter().println("<h1>注册成功<h1/>");
            }else {//不允许注册
              resp.getWriter().println("<h1>注册失败,账号已重复<h1/>");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }


    }
}

运行结果

总结

1.Tomcat

理解什么是动态Web资源

配置。。。。
2.Serlvet

理解

Servlet、GenericServlet、HttpServlet的关系

Servlet如何创建:

a 创建类(RegisterServlet),继承HttpServlet

b 重写service方法

c 在web.xml中配置

学习注册功能

相关推荐
小江的记录本1 分钟前
【注解】常见 Java 注解系统性知识体系总结(附《全方位对比表》+ 思维导图)
java·前端·spring boot·后端·spring·mybatis·web
跃上青空11 分钟前
Java如何优雅的使用fastjson2进行枚举序列化/反序列化,欢迎探讨
java·开发语言
Mr.456720 分钟前
Spring Boot 集成 PostgreSQL 表级备份与恢复实战
java·spring boot·后端·postgresql
架构师沉默40 分钟前
为什么一个视频能让全国人民同时秒开?
java·后端·架构
生命不息战斗不止(王子晗)1 小时前
mysql基础语法面试题
java·数据库·mysql
umeelove351 小时前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
redaijufeng1 小时前
Node.js(v16.13.2版本)安装及环境配置教程
java
AnalogElectronic1 小时前
uniapp学习5,兼容微信小程序的俄罗斯方块游戏
学习·微信小程序·uni-app
知识分享小能手1 小时前
MongoDB入门学习教程,从入门到精通,MongoDB应用程序设计知识点梳理(9)
数据库·学习·mongodb
齐齐大魔王1 小时前
linux-线程编程
java·linux·服务器