1、程序架构
1.1 软件类型
按照软件性质划分系统软件,应用软件
应用软件按照架构来分:
C/S架构(Client/Server模式,特征:需要下载客户端【安装包来进行安装到设备上】)
B/S架构 (Broswer/Server模式)特征:基于浏览器来运行的各种软件,通过http【超文本传输协议】来进行网络通信。
1.2 B/S程序的执行流程
本地浏览器通过在网址栏中输入(URL:统一资源定位符)域名或者IP地址,进行服务器信息的请求,首先会访问DNS服务器,进行域名和服务器的匹配,DNS服务器会把请求转发给IP地址的服务器,由这台服务器给客户端一个响应,会返回一堆(js+css+html)代码交由浏览器进行解释执行。
特征:一次客户端浏览器的请求对应着一次服务器端的响应。
2、搭建Web环境
2.1 安装配置Tomcat步骤
tomcat如何配置环境变量
一、配置Tomcat环境变量
1,新建变量名:CATALINA_BASE,变量值:C:\tomcat
2,新建变量名:CATALINA_HOME,变量值:C:\tomcat
3,打开PATH,添加变量值:%CATALINA_HOME%\lib;%CATALINA_HOME%\bin
二、启动Tomcat服务
方法两种:
1,方法一:在CMD命令下输入命令:startup即可启动服务。
2,方法二:右键点击桌面上的“我的电脑”->“管理”->“服务和应用程序”->“服务”,找到“Apache Tomcat”服务,右键点击该服务,选择“属性”,将“启动类型”由“手动”改成“自动”。
三、测试Tomcat
打开浏览器,在地址栏中输入http://localhost:8080回车,如果看到Tomcat自带的一个JSP页面,说明你的Tomcat已搭建成功。
2.2 IDEA创建web项目
idea中选择File,点击New project,选择Java Enterprise,右侧配置Application Server,然后勾选Web Application就可以创建java web项目,目录会多一个web的目录,这个目录会存放web项目运行所需要的资源,比如web.xml及默认的index.jsp页面。
IDEA2023创建项目,先创建JavaSE项目,然后在项目上右键,点击add freamwork support,勾选Web Application选项,然后手动再配置tomcat即可。
2.3 Servlet
是一个特殊的Java类,如果继承了此类(实现了接口),则普通的Java类也可以接收web请求。
HttpServlet Java类 继承
Servlet 接口 实现
-----------------------------------------------
HttpServletRequest 请求对象,里面内置了请求中所包含的所有信息,请求参数等,请求头,请求体。
HttpServletResponse 响应对象,给客户端浏览器返回数据的时候,可以把一些信息放入响应对象中,客户端就可以获取到服务器端返回的结果数据
doGet()方法,可以处理客户端发送的get方式的请求
doPost()方法,可以处理客户端发送的post方式的请求
web.xml中配置Servelt的映射信息:
<servlet>
<servlet-name>/hello</servlet-name>
<servlet-class>cn.hxzy.Product</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>/hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
3、数据的传递及保存
3.1掌握request和response的使用
String userNo = req.getParameter("userNo"); //获取参数信息
3.2 解决页面中出现的中文乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
3.3掌握session存取数据
session中存值:
String userNo = req.getParameter("userNo");
HttpSession session = req.getSession();//session对象,服务器的会话对象
session.setAttribute("userNo",userNo);
作用域:在一次客户端与服务器的会话中
session取值:
HttpSession session = req.getSession();
Object uno = session.getAttribute("userNo");
String userNo = "";
if (uno != null) {
userNo = (String) uno;
}
PrintWriter out = resp.getWriter();
out.write(userNo);
out.flush();
现象:
服务器端是如何知道浏览器是否关闭的呢?
原理剖析:
session是私有的
3.4 理解application
application是公有的,说的是作用域,全局的(服务器不停止,就会一直存在)
存值:
ServletContext application = req.getServletContext();
application.setAttribute("count",10086);
取值:
ServletContext application = req.getServletContext();
Object count = application.getAttribute("count");
统计网站访问量:
ServletContext application = req.getServletContext();
Object count = application.getAttribute("count");
System.out.println(count);
PrintWriter out = resp.getWriter();
out.print(count);
out.flush();
获取IP地址:
String localAddr = req.getLocalAddr();
String remoteAddr = req.getRemoteAddr();
System.out.println("localAddr:"+localAddr);
System.out.println("remoteAddr"+remoteAddr);
4、Fastjson插件
fastjson是阿里巴巴研发的一个开源的技术插件,主要的作用就是可以把数据格式化为json格式。
5、跨域
Access to XMLHttpRequest at 'http://localhost:8090/hello' from origin 'http://127.0.0.1:8848' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
阻止了一个跨越资源共享请求
CORS全称Cross-Origin Resource Sharing,即跨域资源共享
Servlet解决跨域,配置响应头:
resp.setHeader("Access-Control-Allow-Origin","http://127.0.0.1:8848");
6、分层开发及MVC
三层:表示层、业务逻辑层、数据访问层。三层之间是互相调用,互相依赖。
MVC模式:
M:model,指的是模型,包含业务逻辑层,数据访问层,实体类
V:view ,指的是视图,包含表示层
C:Controller,指的是控制器:Servlet
控制器做了什么事情:
1、接收前端请求,把请求交由模型来处理
2、把模型返回的数据提供给视图来展示
模型做了什么事情:
1、负责处理控制器交付的任务
2、把处理结果交给控制器
视图做了什么事情:
1、用来展示数据
2、接收用户输入的数据,交给控制器
控制器可以理解为是视图与模型中间的连接桥梁。
7、过滤器
package cn.hxzy.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
@author:mengshujun
@createTime: 2024-03-13 10:22:29 星期三
*/
@WebFilter("/*")
public class ASetCharacterFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("进入charset过滤器....");
HttpServletRequest req=(HttpServletRequest)servletRequest; //向下转型
HttpServletResponse resp=(HttpServletResponse)servletResponse;
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
resp.setHeader("Access-Control-Allow-Origin","http://127.0.0.1:8848");
//放行
filterChain.doFilter(req,resp);
}
@Override
public void destroy() {
}
}
8、设置运行前端页面携带cookie
1、前端设置:axios
axios.defaults.withCredentials=true
注意:发送axios请求的时候,不要写localhost,不识别,必须写成本机IP地址(127.0.0.1)
2、后台设置允许cookie等身份凭证信息
resp.setHeader("Access-Control-Allow-Credentials","true");
9、资源保护
package cn.hxzy.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
@author:mengshujun
@createTime: 2024-03-13 22:23:59 星期三
*/
@WebFilter(value = {"/app/getMessage","/app/*"})
public class LoginStatusFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("进入LoginStatusFilter过滤器....");
HttpServletRequest req=(HttpServletRequest)servletRequest; //向下转型
HttpServletResponse resp=(HttpServletResponse)servletResponse;
resp.setHeader("Access-Control-Allow-Origin","http://127.0.0.1:8848");
resp.setHeader("Access-Control-Allow-Credentials","true");
HttpSession session = req.getSession();
Object userNo = session.getAttribute("userNo");
if(userNo==null){
//证明没有登录,则拦截
//jsp页面,异步请求
PrintWriter out = resp.getWriter();
out.print("未登录,无权访问!");
out.flush();
return;
}
filterChain.doFilter(req,resp);
}
@Override
public void destroy() {
}
}
10、url参数中有特殊符号的处理
url参数中有+、空格、=、%、&、#等特殊符号的处理
解决办法1:
将这些字符转化成服务器可以识别的字符,对应关系如下:
URL字符转义
+ URL 中+号表示空格 %2B
空格 URL中的空格可以用+号或者编码 %20
/ 分隔目录和子目录 %2F
? 分隔实际的URL和参数 %3F
% 指定特殊字符 %25
# 表示书签 %23
& URL 中指定的参数间的分隔符 %26
= URL 中指定参数的值 %3D
解决办法2:
把前端参数使用encodeURIComponent()方法进行编码