学习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中配置

学习注册功能

相关推荐
daqinzl几秒前
java获取机器ip、mac
java·mac·ip
激流丶16 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue20 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式37 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
Mephisto.java37 分钟前
【大数据学习 | kafka高级部分】kafka中的选举机制
大数据·学习·kafka
晨曦_子画42 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
Heavydrink1 小时前
HTTP动词与状态码
java
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
计算机-秋大田2 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue