移动应用开发--5.10学习日志

准备工作

下载tomcat 9.0.62
在这里插入图片描述

1.Servlet

Servlet是Sun公司开发动态web的一门技术
Sun在这些API中提供一个接口叫作:Servlet,如果你想开发一个Servlet程序,只需要两步:

  1. 编写一个类,实现Servlet接口。
  2. 把开发好的Java类部署到web服务器中。

把实现了Servlet接口的Java程序,叫作Servlet

2.Hello Servlet

1.构建一个普通的Maven项目(主工程),删除里面的src目录,之后的学习都是在该项目里建立Modle(子工程)。

在这里插入图片描述

2.创建Model子工程。

在这里插入图片描述

遇到的问题:创建的Model子工程下没有webapp目录

创建Model时,选择的是New Model 然后直接点击create。(就是没有选择导入框架
解决办法:创建Model时,点击Maven Archetype 在Archetype中选择框架,再点击Create等待自动创建。
在这里插入图片描述

创建好的Model子工程

在这里插入图片描述

3.在主工程的pom.xml中导入依赖。

maven 版本依赖、版本更新、版本查询网站:https://mvnrepository.com/
在这里插入图片描述

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

在这里插入图片描述

Maven子父项目:

    父项目中的jar包子项目可以使用,子项目的jar包父项目不可以使用。

构建后servlet-01子项目后
父项目中:

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

子项目中:

<parent>
	<artifactId>javaweb</artifactId>
	<groupId>org.example</groupId>
	<version>1.0-SNAPSHOT</version>
</parent>

4.编写一个servlet程序:

1.编写一个普通类。
2.实现Servlet接口,这里我们直接继承(extends)HttpServlet。
public class Hello 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);
    }
}

在这里插入图片描述

3.编写Servlet的映射。

为什么要映射?
    我们写的是Java程序,但是要通过浏览器访问。而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需要给它一个浏览器能够访问的路径。

在web.xml中配置。
在这里插入图片描述

5.配置tomcat

之前博客有写 添加链接描述

6.启动Tomcat

启动后自动跳转到http://localhost:8086/servlet_01_war/
在这里插入图片描述
在url路径上加/hello
http://localhost:8086/servlet_01_war/hello
页面显示我们doGet里设置好的内容Hello Servlet
在这里插入图片描述

可能遇到的问题:

500:Tomcat版本过高,换成9.0

3.Mapping原理

一个Servlet可以指定一个映射路径
一个Servlet可以指定多个映射路径
一个Servlet可以指定通用映射路径
指定一些后缀或者前缀等等……

优先级问题:
    指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。

4.ServletContext

    Web容器在启动的时候,它会为每个Web程序都创建一个对应的ServletContext对象。它代表了当前的Web应用。

共享数据:

    我在这个Servlet中保存的数据,可以在另一个Servlet中拿到.

1.存:Hello类里的内容:(向ServletContext写数据)

package com.example.servlet;

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.PrintWriter;

public class Hello extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//将数据保存在ServletContext中;名字:username;值(数据):zhang san
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("username","zhang san");
    }

}

2.取:新建一个GetData类(获取信息类)

package com.example.servlet;

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.PrintWriter;

public class GetData extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String str = (String) servletContext.getAttribute("username");

        PrintWriter writer = resp.getWriter();
        writer.println(str);
    }
}

tips:映射关系也需要补充好

如果先进入http://localhost:8086/servlet_01_war/getdata,则页面显示null(还未获取到信息)。
在这里插入图片描述
再进入http://localhost:8086/servlet_01_war/hello页面为空
在这里插入图片描述
再次进入http://localhost:8086/servlet_01_war/getdata页面显示zhang san
在这里插入图片描述

若获取数据为中文张三,显示界面可能会??(乱码)
在这里插入图片描述
在GetData类中加入下面的代码。

//响应到浏览器(处理乱码问题(配置类型和编码))
resp.setContentType("text/html");//响应类型
resp.setCharacterEncoding("UTF-8");//响应的编码格式

在这里插入图片描述

ServletContext获取初始化参数

1.在配置文件web.xml中设置初始化参数

<!--配置一些web应用初始化参数-->
	<context-param>
        <param-name>Good Morning</param-name>
        <param-value>2022-05-15 07:22</param-value>
    </context-param>

2.新建GetInit类

package com.example.servlet;

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;

public class GetInit extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//1.获取ServletContext对象
        ServletContext servletContext = this.getServletContext();
        //2.获取初始化参数
        //引号之间的内容要和<param-name>一致,否则跳转到http://localhost:8086/servlet_01_war/getinit,弹出页面显示null
        String str = servletContext.getInitParameter("Good Morning");
        //3.输出结果
        resp.getWriter().print(str);
    }
}

3.配置GetInit映射

    <servlet>
        <servlet-name>getinit</servlet-name>
        <servlet-class>com.example.servlet.GetInit</servlet-class>
    </servlet>

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

4.运行在这里插入图片描述

ServletContext请求转发

请求A界面,实际访问B界面,URL不变。
1.创建GetRequestDispatch类

package com.example.servlet;

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;

public class GetRequestDispatch extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        //进入了/getRequestDispatch 界面
        System.out.println("进入了GetRequestDispatch");
        //实际被转发到了/getinit 界面
        servletContext.getRequestDispatcher("/getinit");
        servletContext.getRequestDispatcher("/getinit").forward(req,resp);
    }
}

2.配置映射关系

 <servlet>
        <servlet-name>getRequestDispatch</servlet-name>
        <servlet-class>com.example.servlet.GetRequestDispatch</servlet-class>
    </servlet>

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

3.运行:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值