JavaWeb

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 &quot;%r&quot; %s %b" />
</Host>

常见面试题:

请你谈谈网站是如何进行访问的?

  1. 输入一个域名,回车
  2. 检查本机hosts配置文件有没有这个域名的映射
    1. 有,直接返回对应的ip
    2. 没有,去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:请求体

img

img

2、响应

HTTP的响应报文也由三部分组成(响应行+响应头+响应体):

img

状态码:
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程序:

  1. 编写一个类,实现Servlet接口。

  2. 把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、源码分析

类(继承关系)接口方法方法一方法二
HelloServletdoGetdoPost
HttpServletservice(重写了),调用doGet、doPostdoGetdoPost
GenericServletservice
Servletservice

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

https://i-blog.csdnimg.cn/blog_migrate/7162208e71353c8e6eb21d2a5669f601.png

实现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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值