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