JavaWeb
网站
用户通过浏览器访问某个域名或ip后,浏览到的综合性页面。
实际是发布在服务器上的一个应用程序,通过浏览器访问。
网页
网站中的某张页面
-
静态页面:所有人看到的内容都一样
-
动态页面:不同的人看到页面中的数据不一致
JavaWeb就是在B/S模式下,使用Java开发综合性web服务网站的技术。
网络服务器
部署web项目的平台
Tomcat
由Apecha、Sun公司及其他公司和个人共同开发的web服务器。
免费、开源、轻量级、在中小型系统中普遍使用。
是学习和开发web项目的首选服务器。
异步和同步:同步执行是指在执行程序时,一切程序按照流程顺序执行;异步是指多个线程同时执行。
Maven
用于管理项目的工具。如管理项目中所需的文件、打包项目等。
通过Maven项目中加入某个jar文件所诉的dependency(依赖),让其自动从MAven仓库中下载对应jar文件。
Maven依赖官网
导入所需依赖
在Maven依赖官网搜索对应依赖文件后选择版本,找到对应代码,粘贴到项目的pom.xml文件的dependencies标签中
easyexcel使用文档:https://easyexcel.opensource.alibaba.com/
读取Excel文件
//要读取的文件,必须存在
File file = new File("C:\\Users\\Administrator\\Desktop\\员工信息.xlsx");
// EasyExcel.read(要读取的文件,要读取的实体类.class,PageReadListener对象,参数为一个lambda表达式).sheet().doRead();
//PageReadListener对象需要设置泛型为要读取的实体类型,lambda表达式参数为读取到的数据集合
EasyExcel.read(file, Employee.class, new PageReadListener<Employee>((emps) -> {
for (Employee emp : emps) {
System.out.println(emp);
}
})).sheet().doRead();
写Excel
//要写入的文件,可以不存在
File target = new File("d:\\employee.xlsx");
// EasyExcel.write(要写入的目标文件,要写入的实体类.class).sheet("表名").doWrite(要写入的数据集合)
EasyExcel.write(target, Employee.class).sheet("员工信息").doWrite(数据集合);
Tomcat
启动Tomcat
默认启动成功后会自动打开浏览器访问项目,也可以通过“localhost:8080/项目名”访问。
web资源目录结构
webapp下如果有index文件,访问项目后会自动访问index文件,如果没有名为index的文件,就会出现404,表示index页面不存在
项目上下文路径
域名+端口+项目名 称为项目上下文路径
如localhost:8080/web01就是项目上下文路径,可以理解为项目根目录
webapp目录直接通过项目上下文路径访问,无需显式写出
编写Servlet的步骤
1.在项目中导入Servlet所需依赖
<!-- servlet所需依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0</version> <scope>provided</scope> </dependency>
粘贴在pom.xml文件中的dependencies标签下
2.在项目的java目录下,新建一个类,继承HttpServlet,重写doGet和doPost方法
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.导入依赖 * 2.创建一个类,继承HttpServlet,重写doGet和doPost方法 * 3.在web.xml中设置访问该类的url映射 * */ public class FirstServlet extends HttpServlet { //普通的控制台项目,需要主动运行main方法执行程序 //web项目中的java程序,需要被动运行,在用户通过浏览器访问某个程序的url映射时执行 /* * 当浏览器发送的是get类型的请求,执行这个方法 * */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) { System.out.println("get请求"); } /* * 当浏览器发送的是post类型的请求,执行这个方法 * */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) { System.out.println("post请求"); } }
3.在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"> <!--xml是一个配置文件,属于一种标记语言,通过标签定义内容--> <!--声明Servlet--> <servlet> <!--servlet命名--> <servlet-name>firstServlet</servlet-name> <!--servlet类的全限定名(路径+文件名)--> <servlet-class>FirstServlet</servlet-class> </servlet> <!--定义Servlet的请求映射--> <servlet-mapping> <!--要映射的servlet名,与上方定义的servlet-name一致--> <servlet-name>firstServlet</servlet-name> <!--请求映射url,必须以/开头--> <!--之后通过项目上下文路径+该路径,就能访问FirstServlet类--> <url-pattern>/first</url-pattern> </servlet-mapping> </web-app>
复制资源的相对路径
启动tomcat,访问"localhost:8080/项目路径/first"即可访问自定义servlet类中的doGet方法
解决tomcat控制台中输出中文时的乱码
三层架构
在软件开发中,并不是将所有的功能集成到一个类或文件中实现,而是要将其分层处理。从而达到"高内聚,低耦合"的目的。
低耦合是指降低各个模块之间的关联程度,便于开发和维护,各个模块各司其职。
高内聚指各个模块的功能不开再分。
通常所说的三层架构中的三层,指"数据访问层、业务逻辑层和视图表现层"
-
数据访问层:用于连接操作数据库的类。对数据进行增删改查。
-
业务逻辑层:用于处理业务逻辑,在适当的情况下访问数据访问层中的内容。
-
视图表现层:用于展示和提供用户输入的渠道,在适当的情况下访问业务逻辑层中的内容
解决请求和响应时的中文乱码
public class MServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决请求时的乱码
req.setCharacterEncoding("utf-8");
//解决响应时的乱码
resp.setContextType("text/html;charset=utf-8");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
HTTP状态码
常见状态码 | 说明 |
---|---|
200 | 成功 |
404 | 要访问的资源不存在 |
500 | 服务器内部错误 |
405 | 方法不允许 |
JSP
Java Server Pages
使用Java开发,运行在服务器上的页面,简称为JSP。JSP的后缀名为.jsp
JSP实际是一个Java类,具体为一个Servlet,第一次访问某个JSP页面,相当于编译运行Servlet,会慢一些。
访问JSP的流程:编译对应的Servlet-->运行Servlet。JSP的生命周期同servlet。
JSP的组成
1.HTML元素*
2.Java脚本*
<% java代码; %>
3.表达式*
用于在页面中输出变量或字符串。
无需分号。
<%=变量%>
4.注释
jsp注释在访问jsp时不会在浏览器中看到
html注释在访问jsp时会再浏览器中看到
<%--注释--%>
5.指令
<%@ 指令名 属性="值"%>
-
page指令
-
用于设置当前页面的属性
-
-
include指令
-
用于嵌入其他页面
-
-
taglib指令
-
用于导入其他标签库
-
6.声明
可以在这里定义方法、全局变量等
<%! void fun(){} %>
7.动作
使用标签定义一些功能。
<jsp:单词></jsp:单词> //包含另一张页面 <jsp:include page="路径"></jsp:include>
请求转发和重定向
请求转发
request.getRequestDispatcher("目的路径").forward(request,response)
- 使用请求转发跳转到目的地后,浏览器访问的地址栏是最初访问的路径
- 可以在请求转发时,在Request对象中保存数据,如request.getParameter()、request.setAttribute()
- 在执行查询时,通常将查询后的结果保存在request对象中后,使用请求转发跳转到页面中。
重定向
response.sendRedircet("目的路径")
使用重定向跳转到目的地后,浏览器的地址栏是最终访问的路径
如果在重定向时使用request对象保存数据,后续无法获取保存的内容
在执行增删改查后使用重定向跳转到目的地,防止重复提交
路径问题
绝对路径
完整路径
相对路径
- / 从项目根目录出发,即域名+端口号
- ./ 从当前位置出发
- ../退出当前目录后出发
Ajax
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
任何的浏览器都支持ajax。通过原生的js使用ajax极不方便,这里使用jquery封装后的ajax使用
## 使用
1.在页面中引入jquery文件
```html
<script src="jquery文件路径"></script>
2.给某个节点绑定事件后使用ajax提交数据
<script>
$("#btn").click(()=>{
$.ajax({
//访问的地址
url:'URL地址',
//提交的数据,以键值对的形式提交,也可以提交单个数据
data:{
id:123,
op:"xxx"
},
//提交方式
type:"post",
//访问成功后的回调函数
succuss:(res)=>{//res为访问URL地址后的返回值
},
//访问失败后的回调函数
error:(res)=>{}
});
});
</script>
登出
case "logout":
//销毁session
session.invalidate();
//跳转登录页
resp.sendRedirect("/book_shop/pages/login.html");
break;
EL
Expression Language 表达式语言
是为了使JSP中的输出写起来更加简便,替换JSP中的<%=%>,即表达式。
主要输出保存在某个作用域中的数据。
特点
-
减少代码(获取对象、转换对象、获取对象属性)
-
如果通过"某个作用域对象.setAttribute(String str,Object obj)"方法保存的对象,
在JSP页面中,如果用表达式,写为<%=str>;如果使用EL,写为${str}。
会依次从pageContext-->request-->session-->application中获取指定对象,如果一旦从某个作用域中获取到了对象,就不再判断后续作用域。
也可以指定从某个作用域中获取对象,如${session.str}表示从session作用域中获取对象。
-
-
免去非空判断
-
如果要使用的某个对象不存在,不会输出null,而是输出空字符串""
-
使用
1.获取保存在作用域中的对象
-
获取保存在某个作用域中的对象:${对象名}
-
从指定的作用于中获取对象
作用域单词 对应作用域 代码 pageScope 当前页pageContext ${pageScope.对象} requestScope 请求request ${requestScope.对象} sessionScope 会话session ${sessionScope.对象} applicationScope 项目application ${applicationScope.对象} -
输出对象的属性
${对象名.属性名} ${对象名["属性名"]} 要保证该属性有对应的get方法
-
输出对象的方法返回值
${对象名.方法名()}
2.用户获取当前项目上下文路径(根目录+项目名)
如http://localhost:8080/book_shop是一个项目上下文路径。
在JSP中使用${pageContext.request.contextPath}获取项目上下文路径
3.在页面中获取请求中携带的参数
可以使用EL获取表单提交或地址中?后传递的数据
使用${param.参数}表示request.getParameter("参数")方法获取的数据
如
<form action="xxx.jsp"> <input type="text" name="username"> <input type="submit"> </form> <a href="xxx.jsp?username=admin"></a>
在xxx.jsp中
${param.username}获取提交的数据
注意
-
web.xml版本在4.0之后,在JSP中使用EL时,默认可以识别。
-
如果JSP中无法识别EL,原样输出${}符号时,在指令(<%@ %>)中加入 isELIgnored="false" 表示不忽略EL
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
-
如果在使用EL的过程中,出现PropertyNotFoundException异常,表示未发现指定属性,原因有
-
缺少指定属性
-
指定属性没有对应的get方法
-
JSTL
Java Server Page Standarded Tag Library JSP标准标签库
可以使用JSTL中的特定标签,来替换JSP中常见的java代码,如循环判断等。减少JSP中的java代码,提高页面的可读性。
使用
-
导入jstl依赖
<!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
-
在JSP页面中,加入标签库指令
<!--在当前页面中使用jstl,以c为标签前缀--> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
这句话可以在使用循环时自动生成
-
具体使用
-
定义变量或给变量赋值
<c:set var="变量名" value="值"></c:set> <c:set var="name" value="admin"></c:set>
-
if判断
<c:if test="判断条件"> 满足时执行 </c:if> session.setAttribute("user",用户对象); <c:if test="${empty user}"> <span>请登录</span> </c:if> <c:if test="${!empty user}"> <span>${user.username}</span> </c:if>
-
遍历List集合
//如在servlet中,将查询到的集合保存在request对象中 request.setAttribute("list",查询到的集合) <table> <!--<c:forEach items="要遍历的集合" var="遍历出的每个对象">--> <c:forEach items="${list}" var="obj"> <tr> <td>${obj.属性}</td> </tr> </c:foreach> </table>
-
遍历Map集合
<% HashMap<String,String> hm = new HashMap(); hm.put("yyds","永远单身"); hm.put("awsl","阿伟死了"); hm.put("u1s1","有一说一"); application.setAttribute("hm",hm); %> <c:forEach items="${hm}" var="kv"> <%--${键值对.key} 获取键 ${键值对.value} 获取值 --%> <h2>${kv.key}--${kv.value}</h2> </c:forEach>
-
JSP内置对象
在JSP中,可以不用定义,就能直接使用的对象,称为内置对象。
一共有9个内置对象
"rrppsoace"
-
pageContext
作用域对象,当前页面作用域。
-
request
作用域对象,请求作用域。
-
session
作用域对象,会话作用域。
-
application
作用域对象,项目作用域。
-
response
响应对象
-
out
输出对象,相当于Servlet中的response.getWriter()方法的返回值对象
-
page
表示当前页面自身对象,相当于servlet中的this
-
config
配置对象,获取servlet的配置信息
-
exception
异常对象,只能使用在有isErrorPage="true"声明的jsp页面中,用于获取异常对象
Session和Cookie
session
session称为会话,是一个作用域,使用session.setAttribute()保存数据,使用session.getAttribute()获取数据。
默认session会话有效期为30分钟,可以更改,超时或关闭浏览器,session失效。
保存在session中的数据,可以在同一个站点下的不同页面中共享。
session共享数据的原理
-
访问任意JSP页面时,默认都会创建一个JSESSIONID(可以取消自动创建),是一段session编号,保存在一个cookie文件中
<%--所有jsp页面中,默认开启了session--%> <%@ page session="true"%> <%--让页面默认不使用session--%> <%@ page session="false"%>
自动生成的cookie文件信息,可以看出,随着浏览器关闭,session到期
设置项目全局session有效时长
在web.xml文件中设置,单位为分钟
<!--设置项目中所有session的有效时长,单位分钟-->
<session-config>
<session-timeout>5</session-timeout>
</session-config>
cookie
cookie是一个用于保存数据的对象,实际是一个保存在客户本地的文件。关闭浏览器,cookie依然存在。手动清理或自动超时清理后,数据随之消失。
cookie通常用于更久地保存数据,即便关闭浏览器,也能一直存在。如登录信息、购物车信息等
cookie中保存的数据有上限(4kb),
cookie在浏览器中保存的数量也有上限(30~300根据浏览器不同略有变化)。
创建cookie
//Cookie(String name,String value); Cookie ck = new Cookie("str","hello"); //设置有效时长,单位为秒,如果不设置,关闭浏览器,cookie失效 ck.setMaxAge(7*24*3600);//7天
保存cookie
response.addCookie(ck);
遍历cookie
Cookie[] cks = request.getCookies(); for(Cookie ck : cks){ ck.getName();//获取name ck.getValue();//获取value }
过滤器Filter
是一个特殊的servlet
使用
1.新建一个类,继承HttpFilter
2.重写doFilter()方法,设置过滤条件
package com.hqyj.book_shop.filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
* 自定义过滤器
* 1.创建一个类,继承HttpFilter
* 2.重写受保护的doFilter方法
* 3.配置过滤器
* */
public class MyFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
//获取当前访问的uri(地址)
String uri = req.getRequestURI();
System.out.println(uri + "访问过滤器");
//如果登录成功后,session会保存customer。
//过滤器中判断当前session中是否存在customer
if (req.getSession().getAttribute("customer") != null) {
chain.doFilter(req, res);
return;
}
//如果session中没有customer,只能放行登录、注册页及其相关静态资源和customer模块
if (uri.contains("html") || uri.contains("jquery")|| uri.contains("customer")) {
chain.doFilter(req, res);
}else{
//否则跳转登录页
res.sendRedirect("http://localhost:8080/book_shop/pages/login.html");
}
}
}
3.配置过滤器,过滤一切请求
<!--声明一个过滤器-->
<filter>
<!--过滤器名,无限制-->
<filter-name>myFilter</filter-name>
<!--过滤器类全限定名-->
<filter-class>com.hqyj.book_shop.filter.MyFilter</filter-class>
</filter>
<!--配置过滤器映射-->
<filter-mapping>
<!--过滤器名,与上方对应-->
<filter-name>myFilter</filter-name>
<!--过滤一切请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
面试相关
- get与post的区别?
表单如果是get提交,无法在action中使用?提交数据。表单如果是post方式提交,可以在action中使用?提交数据。get提交的参数在URL中可以看到,post通过HTTP请求体提交参数,在URL中不能看见。post方式更加安全。
- servlet的生命周期?
Servlet生命周期可以被定义为从创建直到销毁的整个过程
构造方法一次-->init()一次-->service()-->destory()一次
在第一次访问某个Servlet时,执行
1.构造方法一次
2.init()一次
3.有service()方法执行service()方法,没有则执行doxxx()方法没如果都没有,报405状态码,表示请求不允许
4.当服务停止时,执行destroy()方法一次
- Tomcat默认端口号是多少?怎么改端口号?
Tomcat默认端口是8080。在目录C:\\Windows\System32\drivers\etc中的hosts文件中,更改端口号。
- Session和Cookie的区别?
(1)session中保存的数据类型可以是任意类型,没有大小限制;Cookie中保存的是键值对,单个值大小上限位4kb。
(2)Session中保存的数据存在服务器端,Cookie中保存的数据存在浏览器中。
(3)Session到期或随着浏览器关闭而失效,Cookie如果设置了有效时长,即使关闭浏览器也会存在,在到期或手动清理后失效。
- 重定向与转发的区别?
1.定义不同。请求转发(Forward):发生在服务端程序内部,当服务器端收到一个客户端的请求之后,会先将请求发给目标地址,再将目标地址返回的结果转发给客户端。张三(客户端)找李四(服务器端)借钱,而李四没钱,于是李四又去王五那借钱,并把钱借给了张三,整个过程中张三只借了一次款,剩下的事情都是李四完成的,这就是请求转发
请求重定向(Redirect):请求重定向指的是服务器端接收到客户端的请求之后,会给客户端返回一个临时响应头,这个临时头中记录了客户端需要再次发送请求(重定向)的URL地址,客户端在收到地址之后,会将请求发送到新的地址上。张三(客户端)找李四(服务器端)借钱,李四没钱,于是李四就告诉张三,“我没钱,你去王五那借“,于是张三又去王五家借到了钱,这就是请求重定向。
2.请求方式不同
请求转发是服务器端的行为,服务器端代客户发送请求,再将结果返回给客户端;而重定向是客户端的行为
3.数据共享不同
请求转发一次共享数据,重定向不共享数据
4.最终URL地址不同
请求转发的URL地址是不变的;而请求重定向的地址是发生改变的
Session和Cookie的区别
- Session保存在服务器中,Cookie保存在浏览器(客户端)中。
- session中保存的数据类型可以是任意的,没有大小限制;Cookie中保存的是键值对,单个值上限为4kb。
- session到期或者随着浏览器关闭而失效,Cookie如果设置了有效时长,及时关闭浏览器也会存在,在到期或手动清理时失效。
JSP内置对象有哪些?
在JSP中,可以不用定义就能直接使用的对象,称为内置对象。
“rrppsoace”
response 响应对象
request 请求作用域 作用域对象
pageContext 当前页面作用域 作用域对象
page 当前页自身对象,表示当前Servlet中的this
session 会话作用域 作用域对象
out 输出对象,相当于Servlet中的response.getWriter()方法返回值对象
application 项目作用域 作用域对象
config 配置对象,获取Servlet的配置信息
exception 异常对象,只能使用在有isErrorPage=“true”声明的JSP页面中,用于获取异常对象。