当前位置: 首页 > article >正文

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并部署项目

代码

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

代码

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()

代码

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:表示响应

代码

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()

代码

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请求向后端发送的数据

代码

<!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>
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对象就可以获得任意请求中的数据 

代码

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"

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

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

代码
<!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方式安全

代码
<!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
代码
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
代码
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中文乱码
代码
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响应

代码 

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("服务器忙,请稍后再试!");
        }
    }
}

运行


http://www.kler.cn/a/572587.html

相关文章:

  • 纯前端使用 Azure OpenAI Realtime API 打造语音助手
  • NO1.C++语言基础|四种智能指针|内存分配情况|指针传擦和引用传参|const和static|c和c++的区别
  • 【工具变量】全国分省市县人口密度数据集-基本无缺失值(2000-2023年)
  • 设计模式:迭代器模式
  • vue中Axios的封装和API接口的管理(待根据实际项目front进行分析)
  • 文本处理Bert面试内容整理-BERT的核心架构是什么?
  • 高频 SQL 50 题(基础版)_610. 判断三角形
  • 【 商用车整车静态功耗优化探究】
  • DeepSeek 全套资料pdf合集免费下载(持续更新)
  • FPGA基础 -- Verilog常用关键字
  • C语言指针操作
  • 类型转换
  • 【音视频】ffmpeg命令分类查询
  • SpringBoot 核心原理深度解析
  • 备考六级:词汇量积累(day3)
  • 并发编程(线程池)面试题及原理
  • 【Linux】之【Bug】VMware 虚拟机开机 一直卡在黑屏左上角下划线闪烁界面
  • 优选算法合集————双指针(专题三)
  • 前端基础之收集表单数据
  • 取消请求:axios.