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