tomcat

Tomcat

javaweb的概念

javaweb指,所有通过Java语言编写可以通过浏览器访问的程序总称叫做javaweb。

javaweb是基于请求和响应来开发的。

什么是请求?

请求就指客户端给服务器发送数据,叫请求也就是request。

什么是响应?

响应就是指服务器跟客户端回传数据,叫响应也就是responce。

响应和请求的关系

请求和响应是相对应的有请求就有响应!

web资源的分类

web资源的分类按实现的技术和呈现的效果不同,又分为静态资源和动态资源两种!

静态资源:html,css,js,MP4,jpg

动态资源:jsp, servlet程序

常用的web服务器

Tomcat:由Apache组织提供的一种Web服务器,提供对jsp和Servlet的支持。它是一种轻量级的 javaWeb容器(
器),也是当前应用最广的JavaWeb服务器(免费)。

Jboss:是一个遵从JavaEE规范的、开放源代码的、纯Java的EJB服务器,它支持所有的JavaEE规范(免费)。

Glassfish:由Oracle公司开发的一款JavaWeb服务器,是一款强健的商业服务器,达到产品级质量(应用很少)。

Resin:是CAUCHO公司的产品,是一个非常流行的服务器,对servlet和JSP提供了良好的支持,
性能也比较优良,resin 自身采用JAVA语言开发(收费,应用比较多)。

WebLogic:是公司的产品,是目前应用最广泛的公司的产品,是目前应用最广泛的服务器,支持JavaEE规范
而且不断的完善以适应新的开发要求,适合大型项目(收费,用的不多,适合大公司)。

如何启动tomcat

找到tomcat目录下的bin目录下的startup.bat双击启动

怎么测试是否启动成功?

打开浏览器在浏览器的地址栏只输入:

http://localhost:8080/

http://127.0.0.1:8080/

http://真实的本机ip地址:8080/

启动成功会出现一只猫

常见的启动失败的情况有:双击startup.bat文件,就会出现一个小窗口一闪而过

这个时候,失败的原因都是没配置好java_HOME

常见的JAVA_HOME配置的失败的原因的以下的几种情况:

  1. JAVA_HOME必须全大写
  2. JAVA_HOME中间必须是下划线,不能是-号
  3. JAVA_HOME配置路径只需要配置到jdk的安装目录即可,不要带上bin目录。
关闭tomcat
  1. 点击tomctat服务器窗口单击x关闭窗口
  2. 把tomcat窗口置为当前窗口CTRL+C关闭
  3. 在tomcat下bin目录下双击shutdown.bat就可以关闭

如何修改tomcat的端口号

mysql的端口号是3306

tomcat的端口号是8080

找到tomcat下的conf目录,找到service.xml的配置文件

找到标签的port值可以修改的范围1-65535

注意:修改完了端口号记着重启tomcat

平时上百度:www.http://baidu.com:80

http的端口号默认是80,写了也会跟你抹去。

怎么部署web工程到tomcat中

第一种方法:只需要把web工程的目录copy到tomcat下的webapps目录下即可。

怎么访问?

打开网页在地址栏中输入http//:ip:端口号/工程名/访问的页面

第二种配置的方法

本机路径C:\tomcat\apache-tomcat-9.0.17\conf\Catalina\localhost

<!-- Context表示一 个工程上下文
路径表示工程的访问路径:/abc
Docbase表示你的工程目录在哪里

<Context path="/abc"" docBase="E: \book" />

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JffUdqDD-1612409066355)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610680285229.png)]

ROOT工程的访问,以及 默认的index.html的页面访问

当我们在浏览器输入如下

http://ip:port/ ========>没有工程名的时候,默认访问的是ROOT工程

当我们在浏览器输入如下

http://ip:port/工程名/ ========>没有资源名默认访问的是indexhtml

IDEA整合tomcat

路径:File | Settings | Build, Execution, Deployment | Application Servers

配置tomcat安装路径就好了

web工程简绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7E1cC0qC-1612409066360)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610766779907.png)]

servlet

什么是servlet的

  1. servlet是JAVAEE的规范之一,规范就是接口
  2. servlet就是JAVAWeb的三大组件之一,三大组件分别为:servlet程序,Filter过滤器,Listener监听器。
  3. servlet就是一个运行在服务器上的Java程序,它可以接受客户端发过来的请求,并响应数据跟客户端。

如何创建servlet程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZljzfVu-1612409066362)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610937970442.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXrexDiy-1612409066365)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610938011005.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CBiRHoJt-1612409066367)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610938094197.png)]

web.xml的配置

 <!--   <servlet>给tomcat配置servlet程序  -->
    <servlet>
        <!--  <servlet-name>给servlet程序起一个别名(一般使用类名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!--  <servlet-class>是servlet的全类名-->
        <servlet-class>com.example.demo.HelloServlet</servlet-class>
    </servlet>
    
    <!--<servlet-mapping>给servlet程序设置一个访问地址-->
    <servlet-mapping>
        <!--<servlet-name>标签的作用是告诉服务器,我当前配置的地址是那个servlet程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--<url-pattern> 标签访问地址-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

注意:/hello必须以/开头约定大于配置

执行原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5OYI3HgL-1612409066370)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1610942313286.png)]

servlet生命周期

  1. 执行了servlet构造方法
  2. 执行了init初始化方法
    在第一步第二步,在第一次访问的时候会创建servlet程序会调用。
  3. 执行了service方法
    第三步,每次访问都会调用
  4. 执行了destroy销毁方法
    第四步,在web工程停止的时候调用。

请求的分发

怎么区分post请求和get请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/demo_war_exploded/" method="post">
    <button type="submit">提交</button>
</form>
</body>
</html>

看源码知道HttpServletRequest接口继承了ServletRequest

我们需要HttpServletRequest下面的getMethod()方法就可以知道返回类型了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EEEKvwi0-1612409066371)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611024925614.png)]

  @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("执行了servlet");
         /*因为servletRequest的类型是一个ServletRequest类,我们要使用他子类的方法所以就向下转型*/
        HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
        String method = httpServletRequest.getMethod();
        if ("GET".equals(method)) {
           doGet();
        }else if("POST".equals(method)){
           post();
        }
    }


    public void doGet(){
        System.out.println("get请求");
        System.out.println("get请求");
    }
    public void post(){
        System.out.println("psot请求");
        System.out.println("psot请求");
    }

通过继承实现servlet程序

实际开发中

  1. 编写一个类去继承HttpServlet(alt+回车,去重写他的抽象方法)
  2. 根据业务去重写doGet和doPost
  3. 到web.xml中去配置servlet程序访问地址
public class HelloServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget执行了");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost执行了");
    }

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Ee5LcZr-1612409066372)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611108936581.png)]

servletConfig类

servletConfig类从名字上面看就知道,是servlet程序的配置信息

servletConfig三大作用

  • 获取servlet对象的名称
  • 获取里面参数的信息
  • 获取servletContext对象
 @Override
    public void init(ServletConfig servletConfig) throws ServletException {

        /*获取servlet对象的名称*/
        System.out.println("servlet对象的名称是="+servletConfig.getServletName());
        /*获取<init-param>里面参数的信息*/
        System.out.println("<init-param>里面参数的信息是                             ="+servletConfig.getInitParameter("username"));
        /*获取servletContext对象*/
        System.out.println("servletContext对象="+servletConfig.getServletContext());
    }

web.xml里面的配置

 <!--   <servlet>给tomcat配置servlet程序  -->
    <servlet>
        <!--  <servlet-name>给servlet程序起一个别名(一般使用类名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!--  <servlet-class>是servlet的全类名-->
        <servlet-class>com.example.demo.HelloServlet</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
    </servlet>

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICnywQi4-1612409066374)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611110175250.png)]

注意:

getServletConfig()的返回值是ServletConfig类

web.xml

<servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>com.example.demo.HelloServlet2</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>root2</param-value>
        </init-param>
    </servlet>
 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget执行了");

        
        ServletConfig servletConfig=getServletConfig();
        /*获取servlet对象的名称*/
        System.out.println("servlet对象的名称是="+servletConfig.getServletName());
        /*获取<init-param>里面参数的信息*/
        System.out.println("<init-param>里面参数的信息是="+servletConfig.getInitParameter("username"));
        /*获取servletContext对象*/
        System.out.println("servletContext对象="+servletConfig.getServletContext());
    }

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l2RJxlg3-1612409066375)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611111229447.png)]

如果重写了init方法

  @Override
    public void init(ServletConfig config) throws ServletException {
        
        System.out.println("重写了init方法");
    }

其余代码不动

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SE6nb5Hf-1612409066377)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611111427949.png)]

会报一个空指针异常

看源码

GenericServlet类中地方init方法

如果我们重写了他的方法init的内容就会被抹去

    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

加上这句代码super.init(config);重写跟父类赋值

getServletConfig();这个方法才能拿到值,

才能正常运行

@Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("重写了init方法");
    }

注意:每一个servlet程序都有一个独立的servletConfig

ServletContext

什么是ServletContext

  1. 它是一个接口,它表示servle上下文
  2. 一个web工程,只有一个servletContext对象实例,
  3. servletContext是一个域对象
  4. servletContext是web工程部署启动的时候创建。在web工程停止的时候销毁。

什么是域对象?

域对象是,可以向map一样存取数据的对象,叫做域对象!

这里的域是存取数据的操作范围,是整个web工程!

Attribute(属性)

​ 存数据 取数据 删除数据

map put() get() remove()

域对象 setAttribute() getAttribute() removeAttribute()

servletContext类的四个作用

  1. 获取 web.xml中配置上下文参数-context-param
  2. 获取当前的工程路径,/工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像Map一样存储数据

获取 web.xml中配置上下文参数-context-param

首先继承Httpservlet

看源码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9uRLJONX-1612409066378)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\httpservle继承关系.png)]

public class SevrletContext extends HttpServlet {


    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        ServletContext servletContext = servletConfig.getServletContext();
        String username = servletContext.getInitParameter("username");
        System.out.println("username的值为"+username);

    }
    
}

获取当前的工程路径,/工程路径

@Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println("**获取当前的工程路径,/工程路径**"+servletContext.getContextPath());


    }

注意:这里获取的工程路径就是网络上面的网络路径!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WPNdXKE-1612409066379)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611319872868.png)]

获取工程部署后在服务器硬盘上的绝对路径

   @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println("获取工程部署后在服务器硬盘上的绝对路径:"+servletContext.getRealPath("/"));
        System.out.println("获取工程部署后在服务器硬盘上的绝对路径:"+servletContext.getRealPath("/css/test.css"));
    }

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rBEXy4Cv-1612409066380)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\部署原理.png)]

黄色的边框证明了webapp就是demo-1.0-SHAPSHOT

也就是说映射到idea的web目录

这里是本机的tomcat:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ATreo8F5-1612409066381)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\部署3.png)]

这里是idea帮忙映射的tomcat:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CNrueovZ-1612409066381)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\部署4.png)]

打开xml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R91XWINO-1612409066382)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\部署5.png)]

C:\Users\34912\IdeaProjects\javaweb\demo\target\demo-1.0-SNAPSHOT打开这地址这就是idea的部署方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i22UnnWN-1612409066383)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\部署2.png)]

像Map一样存储数据


    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        servletContext.setAttribute("username","wmt");
        System.out.println("servletContext的值为"+ servletContext.getAttribute("username"));
    }

注意:必须存进去才可以取到, ServletContext的生命周期是在web工程重启或者结束时销毁,

Http协议

什么是http协议

​ 协议是指双方,或多方,相互约定好的,大家都要遵守的规则,叫做协议。

所谓HTTP协议,就是指客户端服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP协议,

HTTP的协议中的数据叫报文

请求HTTP的协议格式

  • 客户端给服务器发送数据叫做请求
  • 服务器给客户端发送数据叫做响应

请求又分为get请求和post请求两种

get请求

1.请求行

   1. 请求方式                                        get
   2. 请求资源路径[+?+请求参数]
   3. 请求协议的版本号                                 HTTP/1.1

2.请求头

key:value 组成 不同的键值对,表示不同的含义。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMciYrK5-1612409066384)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611371019366.png)]

post请求

1.请求行

   1. 请求方式                                        post
   2. 请求资源路径[+?+请求参数]
   3. 请求协议的版本号                                 HTTP/1.1

2.请求头

key:value 组成 不同的键值对,表示不同的含义。

空行

3.请求体 就是发送 给服务器的数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qsvkcEVv-1612409066385)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\post.png)]

常用请求头

  • accept: 表示客户端可以接受到的数据类型
  • accpet-languege:表示客户端可以接收的语言类型
  • user-agent:表示客户端浏览器的信息
  • host:表示请求时的服务器ip和端口号

那些是get请求那些是post请求

get请求有那些

  1. form标签 method=get
  2. a标签
  3. link标签导入css
  4. script标签引入js文件
  5. img标签引入图片
  6. iframe引入html页面
  7. 在浏览器地址中输入地址后敲回车

post请求有哪些

form标签 method=post

响应的HTTP协议是什么格式

1.响应行

  • 响应的版本和协议号
  • 响应状态码
  • 响应状态描述

2.响应头

key:value 不同响应头,有其不同含义

空行

3.响应体

就是回传给客户端的数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgMH9l31-1612409066387)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611540816345.png)]

常见的响应码有那些

200 表示请求成功

302 表示请求重定向

404 表示服务器收到请求,但是你要的数据不存在(请求地址错误)

500 表示服务器收到请求,但是服务器内部错误(代码错误)

MIME

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

它是一个互联网标准,扩展了电子邮件标准,使其能够支持:

ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。

这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 MIME改善了由RFC 822转变而来的RFC 2822,这些旧标准规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息原本都不能在电子邮件中传输(MIME可以)。MIME规定了用于表示各种各样的数据类型的符号化方法。 此外,在万维网中使用的HTTP协议中也使用了MIME的框架,标准被扩展为互联网媒体类型。

MIME类型格式是“大类型/小类型”,并以某一种文件扩展名想对应

用于WAP服务器服务器)的MIME类型有:
MRP文件(国内普遍的手机).mrp application/octet-stream
IPA文件(IPHONE).ipa application/iphone-package-archive
.deb application/x-debian-package-archive
APK文件(安卓系统).apk application/vnd.android.package-archive
CAB文件([Windows Mobile](https://baike.baidu.com/item/Windows Mobile)).cab application/vnd.cab-com-archive
XAP文件([Windows Phone 7](https://baike.baidu.com/item/Windows Phone 7)).xap application/x-silverlight-app
SIS文件(symbian平台/S60V1).sis application/vnd.symbian.install-archive *(下有)
SISX文件(symbian平台/S60V3/V5).sisx application/vnd.symbian.epoc/x-sisx-app
JAR、JAD文件(JAVA平台手机通用格式).jar .jad下面有

HttpServleRequest类

每次只要有请求进入tomcat服务器,tomcat就会把请求过来的HTTP协议信息解析好封装到Request对象中然后传递到service(doGet或者doPost)中给我们使用,我们可以使用HttpServleRequest对象,获取到使有的请求信息

是由tomcat来创建的,使用完了就销毁

getRequestURI 获取相对路径

getRequestURL 获取网络路径

getRemoteHost 获取端口号

getHeader 获取请求头的信息(在里面输什么就获取什么)

getMethod 获取请求的方法

        /*getRequestURI() 获取相对路径*/
        System.out.println("URI="+req.getRequestURI());
        /*getRequestURL() 获取网络路径*/
        System.out.println("URL="+req.getRequestURL());
        /*IDEA使用127.0.0.1来访问时结果就是127.0.0.1
        *IDEA使用localhost来访问结果是127.0.0.1
        * IDEA使用端口号访问时结果就是端口号
        * */
        System.out.println("ip地址="+req.getRemoteHost());
        /*获取user-Agent的信息*/
        System.out.println("user  agent:"+req.getHeader("user-Agent"));
        /*获取提交方式*/
        System.out.println("请求方式:"+req.getMethod());

获取请求参数

Parameter翻译是参数

getParameterValues() 多个参数返回的是数组

getParameter() 一个参数使用这个

1.form表单get请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/demo2_war_exploded/hello" method="get">
    账号:<input type="text" name="username"><p></p>
    密码:<input type="password" name="password"><p></p>
    c:<input type="checkbox" name="like" value="c">
    java:<input type="checkbox" name="like" value="java">
    javaee:<input type="checkbox" name="like" value="javaee"><p></p>
    <input type="submit">
</form>
</body>
</html>

2.业务层

package com.example.demo2;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servletdemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        System.out.println(username);
        String password = req.getParameter("password");
        System.out.println(password);
        System.out.println(req.getParameter("like"));

    }
}

3.配置服务器

<?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">
    <servlet>
        <servlet-name>Servletdemo</servlet-name>
        <servlet-class>com.example.demo2.Servletdemo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servletdemo</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>
POST请求乱码问题

设置语言utf-8就是中文,必须在getParameter方法之前才有效

 @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("-------------------doPost-----------------");
        /*设置语言utf-8就是中文,必须在getParameter方法之前才有效*/
        req.setCharacterEncoding("UTF-8");
        String username = req.getParameter("username");
        System.out.println(username);
        String password = req.getParameter("password");
        System.out.println(password);
        String[] likes = req.getParameterValues("like");
        System.out.println(Arrays.toString(likes));

    }

请求转发

什么是请求转发?

请求转发是指,服务器接收到资源之后从一个资源跳转到另一个资源的操作就叫做请求转发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pe9jpiBr-1612409066388)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1611717791734.png)]

public class Servletdemo extends HttpServlet {
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("---------ServletdemodoGet-------------");
        String username = req.getParameter("username");
        System.out.println(username);
        /*把开飞机的舒克保存在key里面*/
        req.setAttribute("key","开飞机的舒克");
        /*请求转发*/
        RequestDispatcher servletdemo2 = req.getRequestDispatcher("/Servletdemo2");
//       /*走向哪里*/
        servletdemo2.forward(req,resp);
    }

}
public class Servletdemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("---------Servletdemo2doGet-------------");
        String username = req.getParameter("username");
        System.out.println(username);
        Object key = req.getAttribute("key");
        System.out.println(key);

    }
}
<servlet>
        <servlet-name>Servletdemo</servlet-name>
        <servlet-class>com.example.demo2.Servletdemo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servletdemo</servlet-name>
        <url-pattern>/servletdemo</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>Servletdemo2</servlet-name>
        <servlet-class>com.example.demo2.Servletdemo2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servletdemo2</servlet-name>
        <url-pattern>/Servletdemo2</url-pattern>
    </servlet-mapping>

注意:getRequestDispatcher请求转发这个方法写的地址一定要跟web.xml里面的相同注意大小写

base标签

注意:…/…/index.jsp这个路径是什么意思,

…/是往上一个路径跳一层,如果上一层路径是http://localhost:8080/demo2_war_exploded/b/c/

得到的路径是http://localhost:8080/demo2_war_exploded/index.jsp

base标签的作用当前网页的跳转的起始参照都以base标签里面的href中的网站为参照

base href=“http://localhost:8080/demo2_war_exploded/b/c/a.html”

注意base标签可以a.html可以省略

  1. 构造一个ForWordC的程序
public class ForWrodC extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("b/c/a.html").forward(req,resp);

    }
  1. 配置web.xml
 <servlet>
        <servlet-name>ForWrodC</servlet-name>
        <servlet-class>com.example.demo2.ForWrodC</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ForWrodC</servlet-name>
        <url-pattern>/forWrodC</url-pattern>
    </servlet-mapping>
  1. 在web目录下构造一个b/c/a.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>a</title>
    <h1>这里是a</h1>
    <base href="http://localhost:8080/demo2_war_exploded/b/c/">

</head>
<body>
<a href="../../index.jsp">首页</a>
</body>
</html>
  1. index.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<h1><%= "首页" %>
</h1>
<br/>
<a href="b/c/a.html">a标签跳转</a>
<a href="http://localhost:8080/demo2_war_exploded/forWrodC">请求转发</a>
</body>
</html>

相对路径和绝对路径

在web工程中分为相对路径和绝对路径

相对路径:

. 表示当前目录

… 表示上一级目录

资源名 表示当前目录/资源名

绝对路径:

http://ip:port/工程路径/资源路径

web中/的不同意义

在web中/斜杠也是一种绝对路径

  • 浏览器中

    /斜杠 如果在浏览器中解析得到的地址就是http://ip:port/

    <a href="/">a标签跳转</a>
    
  • 服务器中

/斜杠 如果在服务器中解析得到的地址就是http://ip:port/工程路径

在web.xml配置中

<url-pattern>/forWrodC</url-pattern>

web程序中

 req.getRequestDispatcher("/").forward(req,resp);
 getServletContext().getRealPath("/");

特殊情况: 把斜杠发给浏览器去解析解析出来为:http://ip:port/

resp.sendRedirect("/");

HttpServletResponse类

httpservleresquest和httpservletresponse一样,每次请求进来,tocat服务器都会创建一个request对象传递给servlet程序使用,httpservletrequest表示请求过来的信息,httpservletreponse表示响应的信息,我们如果需要设置返回给客户端的信息,都可以通过httpservletresponse对象进行设置。

两个输出流

字节流 getoutputsteam() 常用于下载(传递二进制的数据)

字符流 getwriter() 常用于回传字符串(常用)

两个流只能使用一个,不然要报错

解决响应乱码问题

方案一

charset字符集的意思

Encoding编码的意思

        /*设置响应的编码格式*/
        resp.setCharacterEncoding("UTF-8");
        /*因为服务器设置了utf-8但是网页没有设置utf-8所以我们获取请求头*/
        resp.setHeader("Content-Type","text/html; charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.write("开飞机的舒克");

方案二

package com.example.demo2;

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;

public class ServletIO extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*此条代码设置了服务器和浏览器的格式都为utf-8*/
        /*注意必须在输入输出流之前设置才有效*/
        resp.setContentType("text/html; charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.write("开飞机的舒克");
    }
}

重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说,我给你一个新地址让你访问,叫做请求重定向(因为之前的地址可能已经废弃)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0unFxyEV-1612409066389)(C:\Users\34912\Desktop\java 笔记\前端基础\图片\1612008759620.png)]

请求重定向的特点:

浏览器地址会发生变化

  • 两次请求
  • 不可以重定向WEB-INF下的数据
  • 不可以共享request域中的数据(request域的数据,每次请求一次都会封装成一个request对象)
  • 可以访问工程外的资源

servlet1如何重定向到servlet2

package com.example.demo2;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet1已经启动");
        resp.setStatus(302);
        resp.setHeader("location","http://localhost:8080/demo2_war_exploded/servlet2");

    }
}

package com.example.demo2;

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;

public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.write("servlet2");
    }
}

你访问,叫做请求重定向(因为之前的地址可能已经废弃)。

[外链图片转存中…(img-0unFxyEV-1612409066389)]

请求重定向的特点:

浏览器地址会发生变化

  • 两次请求
  • 不可以重定向WEB-INF下的数据
  • 不可以共享request域中的数据(request域的数据,每次请求一次都会封装成一个request对象)
  • 可以访问工程外的资源

servlet1如何重定向到servlet2

package com.example.demo2;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet1已经启动");
        resp.setStatus(302);
        resp.setHeader("location","http://localhost:8080/demo2_war_exploded/servlet2");

    }
}

package com.example.demo2;

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;

public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.write("servlet2");
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值