一、什么是javaWeb?
web分为:
- 静态web
- 动态web
web服务器
- JSP/Servlet:B/S架构(浏览器和服务器),基于java语言
- Tomcat实际运行JSP页面和Servlet
面试题:谈谈网站时如何访问的:
1、输入一个域名,回车
2、检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下是否有对应域名:
- 有,则返回对应IP地址,里面有我们需要访问的web文件
- 没有,则去DNS上查找,找到则返回,找百度就返回找不到。
二、HTTP
超文本传输协议,简单的请求-响应协议,运行在TCP之上。
默认端口80。
https:默认端口443
1、HTTP请求
请求方式:
- GET:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏中显示数据内容,不安全,但高效
- POST:请求能够携带的参数没有限制,大小没限制,不会在浏览器地址栏中显示,安全,但不高效
响应状态码:
200 请求响应成功
3*xx 请求重定向
4xx 找不到资源 404
5xx 服务器代码错误 500 502网关错误
面试题:当你的浏览器地址栏输入地址并回车的一瞬间到页面能够展示,经历了什么?
三、Maven
需要导入和配置JAR包
1、什么是Maven?
- 项目架构管理工具
- 核心思想:约定大于配置
- 有约束,不要取违反
2、Maven安装:
1、官网下载,解压
2、配置环境变量
M2_HOME maven目录下的bin目录
MAVEN_HOME maven的目录
path中配置 %MAVEN_HOME%/bin
3、测试安装成功
4、修改配置文件
阿里云镜像:提高下载速度
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
5、建立本地仓库
<localRepository>D:\software\apache-maven-3.8.5-bin\maven-repo</localRepository>
6、IDEA使用maven
四、Servlet
sun公司开发动态web的一门技术,一个接口,开发servlet需要完成两个小步骤:
- 编写一个类,实现servlet接口(HttpServlet->GenericServlet->Servlet)
- 把开发好的java类部署到web服务器中
原理:
实现过程:
1、编写java类,继承HttpServlet,实现servlet接口
package com.yangshuang;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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 HelloServlet extends HttpServlet {
//1、编写java类实现servlet
//由于get或post只是请求实现的不同方式,可以互相调用,业务逻辑一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletOutputStream outputStream = resp.getOutputStream();
System.out.println("进入doGet方法");
PrintWriter writer = resp.getWriter();//响应流
writer.print("hello, servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2、编写servlet映射
(为啥要映射:编写java程序,但是需要通过浏览器访问,而浏览器需要连接web服务器,所以需要在web服务器中注册我们写的servlet,还需要给一个浏览器能访问的路径)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<!--注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.yangshuang.HelloServlet</servlet-class>
</servlet>
<!--servlet请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
3、配置Tomcat
1)找不到artifacts的处理办法:
2)访问指定映射路径,报错java.lang.classnotfoundexception: javax.servlet.http.httpservlet
原因:Tomcat10 支持servlet 5.0版本,而IDEA时支持sevlet4.0,版本不匹配
解决办法:更换Tomcat版本为9.0.xx
mapping问题
1、一个servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2、一个servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>
3、一个servlet可以指定通配映射路径
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4、默认请求路径(少用)
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5、自定义指定一些后缀或前缀等(*前面不能加项目映射路径)
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
6、优先级问题
指定了固有的映射路径优先级最高,找不到的话会走默认的路径
ServletContext
1、共享数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//web容器在启动时,会为每个servlet创建一个servletContext(可以保存数据)
//共享数据,不同的servlet可以对servletContext进行访问,获取数据
ServletContext context = this.getServletContext();
String username = "小明";
context.setAttribute("username", username);
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String)context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字" + username);
}
}
<!--注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.yangshuang.HelloServlet</servlet-class>
</servlet>
<!--servlet请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!--注册servlet-->
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.yangshuang.GetServlet</servlet-class>
</servlet>
<!--servlet请求路径-->
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
2、获取初始化参数
<!--初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
this.getInitParameter("url"); //获取初始化参数
3、请求转发
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/getc").forward(req, resp); //请求转发 路径不会变化
4、读取Properties资源文件
在resource下创建一个db.properties文件
username=root
password=1234
package com.yangshuang;
import javax.servlet.ServletContext;
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.InputStream;
import java.util.Properties;
public class ServletProperties extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(is);
String name = (String)properties.get("username");
String pwd = (String)properties.get("password");
resp.getWriter().print(name + ":" + pwd);
}
}
<!--注册servlet-->
<servlet>
<servlet-name>getp</servlet-name>
<servlet-class>com.yangshuang.ServletProperties</servlet-class>
</servlet>
<!--servlet请求路径-->
<servlet-mapping>
<servlet-name>getp</servlet-name>
<url-pattern>/getp</url-pattern>
</servlet-mapping>
在浏览器打开路径 http://localhost:8080/servlet_01/getp,显示结果如下:
HttpServletResponse
下载文件,步骤
实现重定向:一个web资源收到客户端请求后,通知客户端取访问另一个web资源。
sendRedirect
注意路径问题,否则404
重定向和转发的区别;
相同点:页面都会实现跳转
不同点:
- 请求转发时,URL不会变化 307
- 重定向时,URL会发生变化 302
HttpServletRequest
/代表当前web应用
cookie & session(重点)
会话:用户打开一个浏览器,点击很多超链接,访问多个web资源,关闭浏览器。这个过程可称为一次会话。
有状态会话:一个同学来过教室,下次再来时,我们就会知道他曾经来过
保存会话的两种技术:
cookie:客户端技术(响应,请求)
session:服务器技术/行为,利用这个技术,可以保存用户的会话信息。可以把信息或数据放在session中(servletContext)
常见场景:一个网站登录之后,下次访问不需要重新登录
cookie:
从请求中拿到cookie信息
服务器响应给客户端cookie
一般会保存在本地的用户目录下appdata
一个cookie只能保存一个信息
一个web站点可以给浏览器发送多个cookie,最大存放20个cookie
cookie大小限制4kb
300个cookie浏览器上限
删除cookie
不设置有效期,关闭浏览器,自动失效
设置有效期为0
session:
服务器会给每个用户(浏览器)创建一个session
一个session独占一个浏览器,只要浏览器没关,session会一直存在
用户登录后,整个网站都可以访问 -->保存用户信息
cookie和session区别:
cookie时把用户的数据写给用户的浏览器,浏览器保存
session把用户数据写到用户独占的session中,服务器保存(保存重要信息,减少服务器资源浪费),每个用户有唯一的sessionID
session对象由服务创建
使用场景:
保存用户登录信息
购物车信息
经常使用的信息
设置会话过期 web.xml
<session-config>
<session-timeout>
</session-config>
五、JSP
java Server Page java服务器端页面,和servlet一样,用于动态web技术
最大特点:
写JSP像是在写HTML
区别: HTML值给用户提供静态数据
JSP界面中可以嵌入JAVA代码,为用户提供动态数据
1、JSP原理
浏览器向服务器发送请求时,无论访问什么资源,实际都是在访问servlet
JSP最终也会被转换为java类
JSP实际上是servlet(HttpJSPBase继承HttpServlet)
2、JSP导包:
servlet依赖
jsp依赖
jstl-api JSTL表达式依赖
standard标签库
3、JSP基础语法
嵌套java程序
<%%> 片段
<%= %> 表达式
<%! %> JSP声明
<%--注释--%> 注释
EL表达式 ${}
JSP声明:会被编译到JSP生成的java类中
其他:会被生成到_jspService方法中
JSP的注释不会在客户端显示,HTML的就会
4、JSP指令
<%@page errorPage="页面路径"%> 定制错误页面
<%@page args... %>
<%@include file="" %> 会将两个页面合二为一
<jsp:include page="" /> JSP标签 拼装页面 常用
5、9大内置对象
- PageContext 保存数据,只在一个页面中有效
- Request 保存数据,只在一次请求中有效,请求转发会携带这个数据
- Response
- Session 保存数据,只在一次会话中有效,打开浏览器到关闭浏览器
- Application【ServletContext】 保存数据 只在服务器中有效,从打开服务器到关闭服务器
- config【ServletConfig】
- out
- Page
- exception
6、JSTL、EL表达式
六、JavaBean
固定写法:
- 必须有一个无参构造
- 属性必须私有化
- 必须有对于的get/set方法
一般用来做和数据库的字段映射 ORM对象关系映射
七、MVC三层架构
M:模型 V:视图 C:控制器
八、过滤器filter(重点)
用来过滤网站数据
- 处理中文乱码
- 登录验证
- ...
1、导包 servlet下的filter
2、实现Filter接口,重写intit、doFilter(过滤器继续执行chain.doFilter)、destroy方法
3、web.xml中配置过滤器
<filter></filter>
<filter-mapping></filter-mapping>
九、监听器 Listener
1、实现监听接口
2、web.xml配置监听器
<listener></listener>
十、servlet执行过程
Servlet生命周期分为实例化、初始化、响应请求调用service()方法、消亡阶段调用destroy()方法。
执行过程如下:
1)当浏览器发送一个请求地址,tomcat会接收这个请求
2)tomcat会读取项目中的web.xml中的配置
3)当请求地址符合servlet-mapping标签映射的地址,会进入这个servlet
4)servlet首先会实例化(构造),然后初始化执行init()方法,init()方法至始至终执行一次,servlet对象是单实例
5)根据请求的方式是get或post,在service()方法中调用doget()或dopost()方法,完成此次请求
6)当服务器停止,会调用destroy()方法,销毁实例
————————————————
版权声明:本文为CSDN博主「闰土和 犭查」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44303191/article/details/107705241