JavaWeb

一、什么是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值