●
学习
web
开发,需要先安装一台
web
服务器,将开发好的
web
项目部署在
web
服务器中供外界访问
.
●
Web服务器是指驻留于因特网上某种类型计算机的程序.
●
可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;它是一个容器,是一个连接用户与程序之间的中间件。
●
WEB服务器有很多,流行的WEB服务器有Tomcat 、 WebSphere 、WebLogic、Jboss等。
创建一个java项目,然后进行添加框架
点击项目右键,选择第二个添加依赖 ,选择如下图
将Tomcat集成到项目中
1.将工具栏设置显示
2.点击长方形框
进行命名
选择到配置Tomcat的根目录
之后可自行设置端口,在进行项目的部署
最下面便是访问的地址,名字自己取,然后点击应用
通过配置的地址进行访问后端
设置后,代码如果修改会自动更新过去
Servlet
概述
●
Servlet是Server Applet的简称,意思为用Java编写的服务器端的程序.它运行在web服务器中,web服务器负责Servlet和客户的通信以及调
用Servlet方法。
●
Servlet的作用:
1.接收用户发送的请求数据
2.调用其他的java程序来处理请求
3.根据处理结果,将结果响应给客户端
Servlet
创建和使用
●
1.创建一个类继承javax.servlet.http包下的HttpServlet
●
2.在web.xml文件中配置Servlet
●
3.运行Servlet程序通过浏览器访问
http:localhost:8080/
项目名
/
配置的
url
●
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被
外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文
件中使用<servlet>元素和
<servlet-mapping>元素完成。
使用细节
<servlet>元素用于注册Servlet,它包含有两个主要的子元素:
<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和
Servlet的完整类名。
一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路
径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定
Servlet的注册名称和Servlet的对外访问路径。
url-pattern配置模式:”/”代表当前web应用的根目录
精确匹配 例如/test 访问http://127.0.0.1/项目名/test
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<!--
配置注册serlvet
-->
<servlet>
<servlet-name>login</servlet-name><!--为生成的servlet对象命名-->
<!--配置servlet地址,服务器根据类的地址+反射机制(动态获取类信息,创建对象)-->
<servlet-class>com.ffyc.webback.servlet.LoginServlet</servlet-class>
<load-on-startup>1</load-on-startup><!--值<0,在第一次请求servlet时创建对象,>=0启动时创建-->
</servlet>
<!--
为servlet配置访问地址
-->
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern><!-- http://127.0.0.1:8080/webBack/login -->
</servlet-mapping>
创建发布
web
项目
- web.xml
文件
●
Web.xml文件为web应用的配置文件,它必须放在web应用目录WEB-INF目录下。
●
Web.xml文件用于对web应用下的web资源进行配置,服务器在启动时会读取web.xml文件中的内容。
Servlet
生命周期
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
后端用来处理登录请求的servlet
1.继承HttpServlet
2.重写方法
Servlet接口,是javaWeb最顶级接口,定义servlet中的方法
abstract GenericServlet implements Servlet
destroy();
init();
abstract class HttpServlet extends GenericServlet
service();
LoginServlet extends HttpServlet 也就遵循servlet规范,请求到服务器时.服务器也要遵照servlet规范调用对应的方法
*/
public class LoginServlet_back extends HttpServlet {
/*
创建阶段
serlvet对象不由我们创建,是由服务器创建的,创建有两种情况:
1.默认的,在第一访问对应的servlet时创建.
2.<load-on-startup>1</load-on-startup> >=0 就会在服务器启动时将servlet创建并初始化.
服务器为每个servlet只创建一个对象(单例的),
*/
public LoginServlet(){
System.out.println("LoginServlet无参构造方法");
}
/*
初始化阶段:
在servlet创建成功后,执行完构造方法后,会立即调用init(),来实现一些初始化操作(只执行一次)
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println(config.getServletName());
System.out.println("init"+config);
}
/*
服务阶段:
对象创建,初始化完成后,一旦有客户端请求,就会执行service(),提供服务.
HttpServletRequest req,(表示请求)
HttpServletResponse resp(表示响应)
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service");
System.out.println("service"+req);
System.out.println("service"+resp);
}
/*
销毁阶段: 当服务器关闭,servlet在真正的销毁之前,服务器会调用destroy(),掉用的是已经生成的servlet对象的destory()方法执行一些最终的操作
例如打印日志,例如将内存数据保存到硬盘
*/
@Override
public void destroy() {
System.out.println("destroy");
}
}
HttpServlet类中具有servic方法和doGet和post方法,系统会自动调用service方法,在service方法中会自动识别前端发来的请求,可以通过请求的类型去判断请求的方式,掉用doGet或者Post方法,我们需要在继承HttpServlet类的子类中去重写我们需要的doGet方法或者Post方法
@WebServlet("/lg") //通过该标签可以快速配置该类的访问地址,不用再去web.xml中进行配置
public class LoginServlet_2 extends HttpServlet {
/*
处理doGet方式请求
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
System.out.println(req.getParameter("name"));
System.out.println(req.getParameter("age"));
}
/*
处理post方式请求
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
req.setCharacterEncoding("UTF-8");
String account = req.getParameter("account");
String password = req.getParameter("password");
System.out.println(account);
System.out.println(password);
System.out.println(req.getParameter("xb"));
System.out.println(Arrays.toString( req.getParameterValues("ck")));//在接收多选框的时候使用getParameterValues
//响应
resp.setContentType("text/html;charset=utf-8");
PrintWriter printWriter = resp.getWriter();
printWriter.print("<h1>登录成功</h1>");
//printWriter.print("账号或密码错误");
}
}
在doPost方法中文容易出现乱码:
1.防止在使用请求时出现乱码,在使用请求前先进行处理
req.setCharacterEncoding("UTF-8");
2.防止在响应时出现乱码,在响应前进行处理
resp.setContentType("text/html;charset=utf-8");
http
协议
●
什么是HTTP?
●
超文本传输协议 (HyperText Transfer Protocol)服务器传输超文本到本地浏览器的传送协议,互联网上应用最为流行的一种网络协议,用于
定义客户端浏览器和服务器之间交换数据的过程。
●
HTTP是一个基于TCP/IP通信协议来传递数据.
●
HTTP是一个属于应用层的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统
http
请求
●
http请求?
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个http请求。
请求包括:请求行,请求头,请求体 .
请求行
包含http请求方式,请求资源名称,http版本 .
请求头
包含主机地址,以及客户端的一些环境信息,以键值对的形式传递.
Host:
127.0.0.1:8088 请求的主机地址
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
浏览器能够处理的内容类型
Accept-Encoding:
gzip, deflate, br 浏览器能够处理的压缩编码
Accept-Language:
zh-CN,zh;q=0.9 浏览器当前设置的语言
User-Agent:
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/69.0.3497.100 Safari/537.36 使用的浏览器和操作平台信息
Connection:
keep-alive 浏览器与服务器之间连接的类型
请求体
代表着浏览器在post请求方式中传递给服务器的参数,请求体中参数以键值形式传递,
多个用&链接,服务器接收到后再解析.
username=admin&userpwd=123
http
请求
●
GET方式:
●
超链接访问,默认是GET方式
●
form提交,不指定method,默认为GET方式
●
POST方式:
●
form提交,指定method=“POST”
•
Get方式与post方式的区别
●
Get方式主要是从服务器获取信息;post主要是想服务器提交信息
●
Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据
放置在请求体中提交。
●
GET方式提交的数据大小受限制一般1kb(不同浏览器也会有不同);而
POST则没有此限制。
●
请求和响应是Web交互最基本的模式,在Servlet中,用HttpServletRequest来表示请求。
●
HttpServletRequest :封装了请求的信息,可以从中获取任何请求信息。
●
getParameter(name) --- String 通过name获得值
●
getParameterValues --- String[ ] 通过name获得多值
前端可以接收后端通过添加gson.jar包,将后端数据转换成json格式的字符串供后端进行接收处理
核心代码如下:
Gson gson=new Gson(); //创建转换类
String ad=gson.toJson(admin); //通过该方法可以将对象转换为json的字符串
printWriter.println(ad); //传入前端
在前端有两种接收后端返回值后存储数据的方法:
window.localStorage//本地存储,在浏览器中存储,浏览器关闭也还存在
Window.sessionStorage //会话键存储,浏览器关闭会话结束,数据清除
使用第二种方法进行使用
window.sessionStorage.setItem("admin",resp.data.name); //存入需要使用的数据
var ac=window.sessionStorage.getItem("admin"); //通过键名存储时接收到存储在Window对象中的数据
window.sessionStorage.clear(); //清除存储的用户数据
在前端进行页面跳转的时候需要进行判断是否是满足条件的跳转有两种方式
1.在前端进行设置路由跳转设置
this.$router.push("/main");//进行路由跳转,跳转到指定的路由界面
//路由导航守护 一旦发生路由跳转就会执行该函数 to到哪里去 from是从哪里来 next放行
rout.beforeEach((to,from,next)=>{
if(to.path=='/login'){
//如果用户访问的登录页,直接放行
return next(); }
else{
var token = window.sessionStorage.getItem("admin");
if(token==null){ //为空表示没有登录 返回到登录界面
return next("/login");
}else{
next();
}
}
})
web
会话跟踪机制
●
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
●
会话(
Session
)跟踪是
Web
程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是
Cookie
与
Session
。
Cookie
通过在客户端记录信息确定用户身份,
Session
通过在服务器端记录信息确定用户身份。
●
由于
HTTP
是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通
行证。这样服务器就能从通行证上确认客户身份了。
● Session
是另一种记录客户状态的机制
,
它在用户第一次打开浏览器连接到后端服务器时
,
由服务器创建产生
,
生成一个
id
号
,
作为会话标识
.
●
服务器通过
Cookie
将生成的会话
id
响应到浏览器中
,
之后每次请求将浏览器端的会话id
向服务器端
提交
,
服务器就可以得知是哪个客户端发起的请求
.
session
●
Servlet API中,定义了HttpSession接口,用来封装会话对象。
●
HttpSession是接口,会话对象是Web容器创建的,在Servlet中使用HttpServletRequest中的方法获得会话对象。
●
public HttpSession getSession():获取跟当前请求相关的session,如果不存在session,就创建一个新的session对象返回。
1.浏览器第一次向后端只提交数据。没有会话id
2.浏览器就id号返回
3.之后浏览器的请求都含有id号
在main.js中设置
过滤器
●
Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Servlet, 从而实现一些
特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信
息等一些高级功能。
●
作用:对服务器web资源进行拦截(权限控制,通过拦截资源进行权限控制,是否可以访问)
●
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人
员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截.
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
public class CorsFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
System.out.println("跨域过滤器");
//允许携带Cookie时不能设置为* 否则前端报错
httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
// 在使用时将origin替换成信任的IP
httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie
filterChain.doFilter(servletRequest, servletResponse);
}
}
import javax.servlet.*;
import java.io.IOException;
public class EncodFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("编码过滤器");
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
filterChain.doFilter(servletRequest,servletResponse);//向下执行
}
}
import com.ffyc.webback.model.Admin;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
public class IsLoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpSession session=request.getSession();
System.out.println("登录权限");
Admin admin=(Admin) session.getAttribute("admin");
if(admin==null){ //后端验证失败
PrintWriter printWriter=servletResponse.getWriter();
printWriter.print(201); //告诉后端验证失败
}else{
filterChain.doFilter(servletRequest,servletResponse);//向下执行
}
}
}
在web.xml中配置上述三个过滤器
<!-- 配置跨域过滤器 -->
<filter>
<filter-name>corsFilter</filter-name>
<filter-class>com.ffyc.webback.filter.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>corsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置编码过滤器 -->
<filter>
<filter-name>encodFilter</filter-name>
<filter-class>com.ffyc.webback.filter.EncodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置检验权限过滤器 -->
<filter>
<filter-name>isLoginFilter</filter-name>
<filter-class>com.ffyc.webback.filter.IsLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>isLoginFilter</filter-name>
<url-pattern>/back/*</url-pattern>
</filter-mapping>