JavaWeb
一、Tomcat
问题:启动tomcat,一闪而过解决方式。使用命令行cmd启动startup.bat,发现是没有配置JAVA_HOME\JRE_HOME环境变量。因为tomcat使用java写的。
D:\Java\environment\apache-tomcat-10.0.4\bin>startup.bat
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
1、配置
server.xml
配置启动端口
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
配置网站应用存放地址
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
常见面试题:
请你谈谈网站是如何进行访问的?
- 输入一个域名,回车
- 检查本机hosts配置文件有没有这个域名的映射
- 有,直接返回对应的ip
- 没有,去DNS服务器找,找到的话就返回ip地址
2、网站服务器目录结构
--webapps:tomcat服务器web目录
-ROOT
-ckstudy: 网站的名称
-WEB-INF:
-classes:java程序
-lib:依赖的jar包
-web.xml:网站配置文件
-static:静态资源文件
-index.html :默认的首页
- ......
二、HTTP
(HyperText Transfer Protocol)超文本传输协议 ,基于TCP协议。
1、请求
HTTP请求报文由3部分组成(请求行+请求头+请求体)
HTTP Request :HTTP请求
Request Line:请求行
Header:请求头
Request Body:请求体
2、响应
HTTP的响应报文也由三部分组成(响应行+响应头+响应体):
状态码:
1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间到页面展示,经历了什么?
要点:本地DNS解析,远程DNS,访问服务器,返回结果,浏览器展示。
三、Maven
问题:Maven3.6.3版本与Idea 2018不兼容会报错。改用Maven3.3.9版本。
项目架构管理工具,方便导入jar包。
核心思想:约定大于配置
https://maven.apache.org
1、配置
windows配置环境变量
M2_HOME bin目录
MAVEN_HOME root目录
PATH : bin目录
/conf/settings.xml配置
<!--配置本地仓库-->
<localRepository>D:/Java/respository</localRepository>
<!--配置阿里云镜像,加快下载速度-->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
2、父子工程
类似Java中继承
父项目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ckvsok</groupId>
<artifactId>javaweb</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!--它的子项目列表-->
<modules>
<module>servlet01</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--HttpServlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<!--配置资源,保证资源导出成功-->
<build>
<resources>
<resource>
<!-- 设定主资源目录 -->
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
子项目继承
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--指定父项目的AGV坐标-->
<parent>
<artifactId>javaweb</artifactId>
<groupId>com.ckvsok</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>servlet01</artifactId>
<packaging>war</packaging>
<name>servlet01 Maven Webapp</name>
</project>
四、Servlet
Servlet是动态web的一门技术。sun公司提供Servlet接口。
实现Servlet程序:
-
编写一个类,实现Servlet接口。
-
把Java类部署到web服务器中。
1、依赖
<!--HttpServlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
2、配置文件
/WEB-INF/web.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"
metadata-complete="true">
<display-name>Archetype Created Web Application</display-name>
<request-character-encoding>UTF-8</request-character-encoding>
<!-- Define servlets that are included in the example application -->
<!--定义servlet的名字和Java类名 , 类名必须是全限定名-->
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.ckvsok.servlet.HelloWorld</servlet-class>
</servlet>
<!--servlet映射 ,名字与servlet名字对应 ,填写URL的访问地址,浏览器通过地址可以访问这个动态servlet-->
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<!--/*.do 表示以*后面结尾的URL(.do结尾的)都能被访问到-->
<url-pattern>/HelloWorld</url-pattern> <!--/不能省略-->
</servlet-mapping>
</web-app>
3、java实现代码
/**
* Author:ckvsok
* Date:2021/4/1
**/
package com.ckvsok.servlet;
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;
//编写类实现Servlet接口,由于HttpServlet已经实现了,所以这里直接继承
public class HelloWorld extends HttpServlet {
@Override
//重写doGet、doPost方法,对应不同请求类型
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World! ck</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World! ck</h1>");
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
4、源码分析
类(继承关系) | 接口方法 | 方法一 | 方法二 |
---|---|---|---|
HelloServlet | doGet | doPost | |
HttpServlet | service(重写了),调用doGet、doPost | doGet | doPost |
GenericServlet | service | ||
Servlet | service |
5、原理
Java实现了Servlet,浏览器需要访问服务器展示这个动态Servlet,所以Java类必须在服务器配置中填写注册,并分配访问地址。
6、域对象
域对象是服务器在内存上创建的存储空间,用于在不同动态资源(servlet)之间传递与共享数据。
1、ServletContext
ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。
1.生命周期
当web应用被加进容器时,创建代表整个web应用的ServletContext对象,当服务器关闭,或web应用被移除时,ServletContext对象跟着被销毁。
2.作用范围
整个web应用。
通过方法可以做:
获取初始化值
请求转发
读取系统资源
2、HttpServletRequest
1.生命周期
在service方法调用前由服务器创建,传入service()方法,整个请求结束,ServletRequest生命周期结束。
2.作用范围
整个请求链。(请求转发也存在,请求转发属于一次请求。)
获取前端传递的参数
请求转发
HttpServletResponse
下载文件
验证码功能
重定向
面试题 :重定向和转发的区别?
相同点:页面发生转换
不同点:请求转发:URL不变,307;重定向:URL变化,302;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7gSHazhO-1617433582738)(JavaWeb.assets/image-20210401163957225.png)]
3、Session
1、生命周期
服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个并返回。
当一段时间内,session没有被使用(默认是30分钟),服务器会销毁该session。如果服务器非正常关闭(强行关闭),还未到期的session也会被销毁。
另外,调用session的invalidate()方法可以立即销毁session。
2.作用范围
一次回话
7、Cookie、Session
1,session 在服务器端,cookie 在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
5,用户验证这种场合一般会用 session
因此,维持一个会话的核心就是客户端的唯一标识,即 session id
8、MVC三层架构
模型 Model
视图 View
控制器 Controller
现在加一个业务层Service
9、Filter
实现Filter接口,重写对应的方法 ,使用上跟Servlet类似,可以写多个过滤器。
web服务器关闭的时候,过滤器才销毁。
实现权限拦截
用户登录后才能进入主页! 用户注销后就不能进入主页!
五、JSP
1、原理
Java Server Pages :sun公司,用于开发动态web。
JSP也是要转化为一个Java类。JSP本质上就是一个Servlet。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjTK4lvV-1617433582739)(JavaWeb.assets/image-20210402090823364.png)]
2、基础语法
<%@ page>
<%--JSP表达式,用来输出。底层是定义在JSP生成的class的方法中--%>
<%= new java.util.Date()%>
<%--jsp脚本片段。底层是定义在JSP生成的class的方法中--%>
<%
int sum =0;
for(int i = 1;i<=100;i++){
sum+=i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
<%--jsp申明,底层是定义在JSP生成的class中--%>
<%! Java代码 %>
EL表达式
3、作用域
pageContext :
JSP中可以通过这个对象获得下面8个对象。
-
session
-
application
-
config
-
out
-
page
-
request
-
response
-
Exception
class的方法中–%>
<%= new java.util.Date()%>
<%–jsp脚本片段。底层是定义在JSP生成的class的方法中–%>
<%
int sum =0;
for(int i = 1;i<=100;i++){
sum+=i;
}
out.println(“
Sum=”+sum+"
");%>
<%–jsp申明,底层是定义在JSP生成的class中–%>
<%! Java代码 %>
EL表达式
```jsp
3、作用域
pageContext :
JSP中可以通过这个对象获得下面8个对象。
-
session
-
application
-
config
-
out
-
page
-
request
-
response
-
Exception