JavaEE Servlet01

目录

回顾

javaEE概述

web开发概述

web服务器

web开发环境搭建

创建发布web项目

代码

运行

Servlet概述

Servlet创建和使用

web.xml讲解

API

无参构造方法

init()

service()

destory()

Servlet生命周期

http协议,http请求

什么是http?

http请求:

代码

运行

代码

运行

get请求

代码

运行

post请求

代码

运行

doGet和doPost

doGet

代码

运行

doPost

代码

运行

解决doPost中文乱码

代码

运行

http响应

代码

运行


回顾

JavaSE Java最基础 面向对象 常用类 集合 异常 IO 网络 线程 jdbc GUI

数据库 MySQL 创建库 创建表 增删改查

前端(网页) html css js vue.js(js框架控制逻辑) elementui(UI框架,封装UI User Interface)

JavaEE Java企业版 Java后端(后端+JavaSE)


javaEE概述

web开发概述

web服务器

通过web服务器解决前端程序访问到后端程序的问题

后端程序为了能让前端程序能够远程的访问到,需要将后端的程序部署在服务器中,这样前端就可以远程访问,并且向前端做出响应。

严格意义上的服务器指得是一款软件,里面可以放置文件,让别人可以远程访问,并且有请求必有响应;

宏观意义上是软件+硬件。

服务器是一个容器,是一个连接用户与程序之间的中间件。

web开发环境搭建

后端开发准备工作

安装tomcat服务器

tomcat是一个web服务器,可以运行我们的java后端程序

1、下载

2、安装jdk 配置Java_HOME path

3、解压tomcat

4、进入bin目录 双击startup.bat 启动tomcat

5、访问IP+端口 127.0.0.1:****

创建发布web项目

1、创建一个web后端项目 并创建了一个Servlet程序并配置了Servlet程序

2、把web后端项目部署到mcat中,在idea中集成tomcat并部署项目

代码

java 复制代码
package com.ffyc.webserver.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


​
package com.ffyc.webserver.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet{

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("接收登录请求");
    }
}
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">
    
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.ffyc.webserver.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
</web-app>

运行

Servlet概述

servlet:server+applet javaEE Java服务器端/Java后端 用Java写的服务器端的应用程序

被部署在服务器中,服务器负责管理并调用servlet

作用:

1、接收用户发送的请求

2、调用其他Java程序进行处理

3、向前端做出响应

Servlet创建和使用

创建servlet:

1、自己创建一个类,并继承HttpServlet,这样我们的类也就遵守了javaEE规范

2、重写父类方法

3、在web。xml文件中配置Servlet

web.xml讲解

xml文件:也是属于一种标记语言,但是与html不同,xml主要用来存储配置数据的

web.xml文件:是用来存储我们当前配置信息的,例如配置Servlet,过滤器,监听器......

此文件是服务器启动时,由服务器读取,名字和位置不能改

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">
    <!--注册servlet-->
    <servlet>
        <servlet-name>login</servlet-name><!--为servlet对象定义名称-->
        <!--配置servlet类名,服务器启动时会创建此类的对象,只能创建一次-->
        <servlet-class>com.ffyc.webserver.servlet.LoginServlet</servlet-class>
    </servlet>
    <!--为servlet配置访问地址-->
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern><!--前端访问地址,必须以'/'开头-->
    </servlet-mapping>
</web-app>

API

无参构造方法

无参构造方法,只被调用一次,一个Servlet类只被创建一个对象

什么时候调用:Servlet生命周期的开始

1、第一次向Servlet程序发送请求时,

2、服务器启动时创建,需要在web.xml文件中进行配置<load-on-startup>1</load-on-startup>

代码

java 复制代码
package com.ffyc.webserver.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet{
 
    public LoginServlet(){
        System.out.println("LoginServlet 无参的构造方法");
    }
}

运行

init()

init初始化servlet的,为servlet对象构造方法执行完毕后执行,也是只执行一次的

是servlet规范必须要调用的方法

如果没有什么可以初始化执行的,可以不重写,默认会调用父类中的init()

代码

java 复制代码
package com.ffyc.webserver.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet{

    @Override
    public void init() throws ServletException {
        System.out.println("init");
    }
}

service()

多次被执行,用来提供服务的

HttpServletRequest:用来封装请求数据的(前端发送的数据都被包装到此对象中)

HttpServletResponse:表示响应

代码

java 复制代码
package com.ffyc.webserver.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet{
 
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service"); 

}

destory()

在服务器关闭时调用

最终需要执行的代码可以写在此方法中

如果没有什么需要执行的最终操作,可以不重写,默认会调用父类中的destroy()

代码

java 复制代码
package com.ffyc.webserver.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet{

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

运行

Servlet生命周期

开始:第一次访问/服务器启动时创建 调用无参构造 一次

初始化:在构造方法执行完后,执行一些初始化操作 可以不写,会调用父类的 一次

服务:多次调用 每一次请求都会调用service()

销毁:在服务器关闭时执行 执行一些必要的操作 可以不写,会调用父类的 一次

http协议,http请求

什么是http?

超文本传输协议:属于应用层协议,传输的内容必须是超文本内容(网页内容)

在网页上点击超链接,提交表单都可以向后端发生一个http请求

http请求:

一次http请求包含请求行,请求头,请求体。

请求行:包含请求方式(get/post),请求的资源(地址)... 浏览器自动发送

请求头:包含客户端的一些环境信息(浏览器版本,客户端ip...)

请求体:包含的是post请求向后端发送的数据

代码

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<a href="http://127.0.0.1:8080/webserver/login">登录</a>
		
		<form action="http://127.0.0.1:8080/webserver/login" method="post">
			账号<input type="text" name="account" value=""/>
			密码<input type="password" name="password" value=""/>
			<input type="submit" value="登录"/>
	</body>
</html>
java 复制代码
package com.ffyc.webserver.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; 

public class LoginServlet extends HttpServlet{ 

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service");
        System.out.println(req.getParameter("account"));
        System.out.println(req.getParameter("password"));
    }
}

运行

HttpServletRequest 表示请求对象,服务器将请求数据都封装到HttpServletRequest对象中

通过HttpServletRequest对象就可以获得任意请求中的数据

代码

java 复制代码
package com.ffyc.webserver.servlet;

import com.ffyc.webserver.dao.LoginDao;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class LoginServletDemo2 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得请求行,请求头数据(浏览器主动提交的数据  后期会用到)
        System.out.println(req);
        //获得请求方式
        System.out.println(req.getMethod());
        //获得客户端IP
        System.out.println(req.getRemoteAddr());
        //客户端端口
        System.out.println(req.getRemotePort());
        //服务器IP
        System.out.println(req.getServerName());
        //服务器端口
        System.out.println(req.getRemotePort());
        //获取URL或网络连接的协议部分
        System.out.println(req.getProtocol());
        //请求头对应键值
        System.out.println(req.getHeader("User-Agent"));
        System.out.println(req.getHeader("Content-Length"));
    }
}

运行

get请求

超链接发送的默认是get请求,表单 method="get"

主要用于从后端获取数据,也可以向后端传递少量数据;

发送的数据在请求地址中包含,不在请求体中。发送的数量会由限制,相对上也不安全

代码
html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<a href="http://127.0.0.1:8080/webserver/login?account=admin&password=111">登录</a>

        
		<form action="http://127.0.0.1:8080/webserver/login" method="get">
			账号<input type="text" name="account" value=""/><br />
			密码<input type="password" name="password" value=""/><br />
			<input type="submit" value="登录"/>
		</form>
	</body>
</html>
运行

post请求

表单 method="post"

主要是从前端向后端发送数据的

数据不在地址栏中,在请求体中,可以发送大量数据,且相对get方式安全

代码
html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<a href="http://127.0.0.1:8080/webserver/login?account=admin&password=111">登录</a>

        
		<form action="http://127.0.0.1:8080/webserver/login" method="post">
			账号<input type="text" name="account" value=""/><br />
			密码<input type="password" name="password" value=""/><br />
			<input type="submit" value="登录"/>
		</form>
	</body>
</html>
运行

doGet和doPost

前端有get和post请求两种方式,有可能在后端的处理方式是不同的

可以在后端定义不同的处理方法,为get和post请求分别进行处理

一次请求的流程

doGet
代码
java 复制代码
package com.ffyc.webserver.servlet;

import com.ffyc.webserver.dao.LoginDao;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class LoginServletDemo2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget");
        //接收数据
        System.out.println(req.getParameter("account"));
        System.out.println(req.getParameter("password"));
    }
}
运行
doPost
代码
java 复制代码
package com.ffyc.webserver.servlet;

import com.ffyc.webserver.dao.LoginDao;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class LoginServletDemo2 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost");
        //接收数据  post 请求中文会乱码
        System.out.println(req.getParameter("account"));
        System.out.println(req.getParameter("password"));

    }
}
运行
解决doPost中文乱码
代码
java 复制代码
package com.ffyc.webserver.servlet;

import com.ffyc.webserver.dao.LoginDao;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class LoginServletDemo2 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost");
        //接收数据  post 请求中文会乱码
        //设置解码字符编码
        req.setCharacterEncoding("utf8");
        System.out.println(req.getParameter("account"));
        System.out.println(req.getParameter("password"));

    }
}
运行

http响应

代码

java 复制代码
package com.ffyc.webserver.servlet;

import com.ffyc.webserver.dao.LoginDao;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class LoginServletDemo2 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost");
        //接收数据  post 请求中文会乱码
        //设置解码字符编码
        req.setCharacterEncoding("utf8");
        //设置请求中我们自己提交的数据
        String account = req.getParameter("account");
        System.out.println(account);
        String password = req.getParameter("password");
        System.out.println(password);

        //dao jdbc 调用其他程序处理
        LoginDao loginDao = new LoginDao();
        boolean res = false;
        //向前端响应
        //设置响应内容的编码格式
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        try {
            res = loginDao.login(account,password);
            if(res){
                writer.write("登录成功!");
            }else {
                writer.write("账号或密码错误");
            }
        } catch (Exception throwables) {
            throwables.printStackTrace();
            writer.write("服务器忙,请稍后再试!");
        }
    }
}

运行

相关推荐
_丿丨丨_3 分钟前
Apache Httpd 多后缀解析
网络·apache
是姜姜啊!6 分钟前
服务熔断组件sentinel,监控服务-springboot-admin-ui
java·服务器
qw9499 分钟前
SpringBoot3—场景整合:环境准备
java·后端
lly20240611 分钟前
CentOS Docker 安装指南
开发语言
秋说13 分钟前
【Java开发指南 | 第三十五篇】Maven + Tomcat Web应用程序搭建
java·tomcat·maven
我命由我1234515 分钟前
Java Maven 项目问题:com.diogonunes:JColor:jar:5.5.1 was not found in...
java·开发语言·java-ee·maven·intellij-idea·jar·intellij idea
是一个Bug16 分钟前
避免魔法值和多层if的关键:编程范式和设计模式
java·设计模式·log4j
和舒貌17 分钟前
网络通信Socket中多态HandleIO设计模式深度解析
网络·设计模式
已是上好佳1 小时前
整理了一下网络编程中TCP的状态
运维·服务器·网络
技术小齐1 小时前
网络运维学习笔记(DeepSeek优化版) 014网工初级(HCIA-Datacom与CCNA-EI)NAT网络地址转换
运维·网络·学习