学习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文件

<!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代码

img{
    width:100px;
    height: 100px;
    border-radius: 50%;
}

运行结果:

在这里插入图片描述

注意:需要自己手动输出Welcome.html

将某个网页设置网站默认访问的首页

WEB-INF下的web.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

<!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

<!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(先不写)

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

</body>
</html>

运行一下

在这里插入图片描述

在这里插入图片描述

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

项目结构

在这里插入图片描述

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

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

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编写前端后端到路径

	<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特殊,因为是多选框,拿到的是多个值,用数组存储

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实体类

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

要设置编码格式

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中配置
学习注册功能

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A 北枝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值