2020-08-03 Web状态码、get/post请求区别、Maven配置、Servlet的使用、ServletContext的使用

-----------------------------------------JavaWeb------------------------------------------

tomcat乱码问题处理,
tomcat闪退问题:兼容性问题

在tomcat文件夹中
conf下的server.xml可以配置启动端口号,主机名称(改host、C/windows/sys32/driver/etc/host)

端口号
tomcat:8080
mysql:3306
http:80
https:443

网站是如何进行访问的
1)域名访问,发出请求
2)检查C/windows/sys32/driver/etc/host有没有域名映射,有就直接返回对应IP地址
没有,去DNS服务器找(DNS就是管理全世界域名,专门域名IP一一针对)

----------------------------------HTTP-------------------------------

http:(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。
https:安全的,443

请求行
请求方式
GET:传递数据内容能够看到,不安全,但是高效,请求携带参数比较少
POST:安全,不高效,请求参数没有限制

相应状态码:

200:响应成功 200
3**:请求重定向,请求新位置
4XX:找不到资源 404
5XX:服务器代码错误 500
网关错误 502

----------------------------------MAVEN------------------------------

maven:javaweb中需要使用大量的jar包,需要手动去导入,如何实现自动导入jar包?
MAVEN是一个架构管理工具
核心思想:约定大于配置

https://maven.apache.org/
boot放的一些依赖包

MAVEN的环境变量配置
M2_HOME maven目录下的bin目录
MAVEN_HOME maven的目录
系统的path中配置 %MAVEN_HOME%\bin

cmd控制台查看maven版本:mvn -version

修改镜像mirrors:

<mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>

本地仓库/远程仓库

建立一个本地仓库:
localRepository
在conf下的settings.xml中找到settings,加一个

<localRepository>E:\Maven\apache-maven-3.6.3\maven-repo</localRepository>

IDEA中使用Maven
勾选,代表了使用maven模板,选择apache-webapp的模板,
groupID 公司
artifactID 项目

Idea中的maven设置
(目前使用的2019.2版本,问题较多,今天试图回退一个版本)

在E:\Maven\apache-maven-3.6.3\conf\settings.xml中配置好本地仓库地址,并且IDEA中–settings----maven中已修改本地仓库地址的情况下Repositories中仍然没有本地仓库信息,并且update无法点击??

------------E:\Maven\apache-maven-3.6.3\maven-repo--------------

这是idea2019版本的bug,换到2018的版本就好了。当然不换也可以,只是在写Pom.xml配置文件的时候不会按照本地仓库去智能提示你,只要你输入正确,没其他的影响。

选中文件夹,mark标记即可,变更文件夹的功能

在IDEA中配置tomcat
添加一个tomcat时,提示要fix,这里其实是要指定一个文件夹,否则IDEA不会去寻找相关项目,
在Deployment中添加一个就可以,其中:
Application context中写的名字,就是localhost:8080/*****的内容
不写的话,项目跑起来就是localhost:8080

Maven在IDEA中边栏功能操作

命令行操作
插件
依赖

POM文件

POM.XML是maven的核心配置文件
GUI、properties是配置、dependencies是相关依赖、building是项目相关结构目录

Maven的资源导出问题(一个很重要的问题):

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>

IDEA如何查看日志?
Help-------------Show log in Explore

-----------------------------------------------Servlet-----------------------------------------

开发动态web
编写一个类实现Servlet接口,开发好的类部署到web服务器中

开发流程:
新建一个项目,空的,不用IDEA的maven模板,删掉Main文件夹

以后的学习都在这个项目里建立model,这个空的工程就是maven主工程

去api网站上
https://mvnrepository.com/
找相应api的maven依赖 粘贴到中,会自动从阿里的中心仓库中寻找相应jar包以及关联jar包,或者可以自己下相应jar包丢到自己的本地仓库中,也可以达到效果(针对无法从中心仓库中下载到的)

关于maven项目的父子工程
父工程的pom.xml中有

<modules>
    <module>servlet-01</module>
</modules>

修改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">
</web-app>

maven环境优化:
修改web.xml为最新的、将maven结构搭建完整(java、resources)

----------Servlet--------

servlet有两个默认的实现类:HttpServlet
继承后需要重写doget()、dopost()方法

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.print("Hello,Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

编写servlet的映射--------需要通过浏览器访问,浏览器需要连接web服务器,所以需要在web服务中注册写的servlet

<!--  注册servlet  -->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.wang.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

-----配置tomcat—注意配置项目发布路径

--------------------------Servlet执行原理---------------------------

servlet是由web服务器调用,服务器收到请求后作出响应

浏览器向服务器发送Http请求,web容器(tomcat)收到请求后,根据请求、请求头、请求体,
带着request、response找servlet,servlet调用service(Request res,Response rsp),收到请求后,
我们编写的实现类重写servlet的方法处理请求,并给出响应信息,封装到response中返回

Mapping问题
一个servlet指定一个映射路径
一个servlet指定多个映射路径
一个servlet指定通用路径(用通配符*,不要这么写,会覆盖一切路径)

指定了固有的servlet的映射路径,优先级最高
如果找不到那就走通配符的定制404页面

public class ErrorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");

        PrintWriter writer = resp.getWriter();
        writer.print("<h1>这是我的404界面</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<servlet>
    <servlet-name>Error</servlet-name>
    <servlet-class>com.wang.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Error</servlet-name>
    <url-pattern>/Error/*</url-pattern>
</servlet-mapping>

---------------------ServletContext---------------------

上下文:web容器启动的时候,它会为每个web程序都创建一个对应的servletcontext对象,代表当前应用

功能一):保存数据

上下文中放置数据:

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取上下文对象
        ServletContext servletContext = this.getServletContext();
        String username = "wang" ;
        servletContext.setAttribute("username",username);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

取出上下文中保存的数据

public class getServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext01 = this.getServletContext();
        String username = (String) servletContext01.getAttribute("username");
        //网页编码的设置,避免乱码
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("姓名是"+username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

XML中servlet配置:

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.wang.servlet.HelloServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>gerServlet</servlet-name>
    <servlet-class>com.wang.servlet.getServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>gerServlet</servlet-name>
    <url-pattern>/get</url-pattern>
</servlet-mapping>

功能二):获取初始化参数

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext servletContext = this.getServletContext();
    String s = servletContext.getInitParameter("url");
    resp.getWriter().print(s);
}
<servlet-mapping>
    <servlet-name>Demo03</servlet-name>
    <url-pattern>/test</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306</param-value>
</context-param>

功能三):请求转发

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext servletContext = this.getServletContext();
    //转发的请求路径
    servletContext.getRequestDispatcher("/test").forward(req,resp);
    System.out.println("这里走的其实是转发路径,这里根本不是Demo03");
}
<servlet>
    <servlet-name>Demo04</servlet-name>
    <servlet-class>com.wang.servlet.ServletDemo04</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Demo04</servlet-name>
    <url-pattern>/forward</url-pattern>
</servlet-mapping>

转发跟重定向:
转发虽然页面转向了第三方页面,但是实际地址不会变

功能四):读取资源文件

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
    Properties properties = new Properties();
    properties.load(inputStream);

    String str1 = properties.getProperty("username");
    String str2 = properties.getProperty("password");
    resp.setContentType("text/html");
    resp.setCharacterEncoding("utf-8");
    resp.getWriter().print("<h1>您当前用户是'"+str1+"',您的密码是'"+str2+"'。</h1>");
}

要注意:这里读取的配置文件路径是根据IDEA编译后的,properties文件所在位置,而不是正在开发过程中的位置
一定要先编译一下,查清它的位置,一般写在resources文件夹里的配置文件最后都是被放在了/WEB-INF/classes/下,这个文件的位置统一称为classpath

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值