当前位置: 首页 > news >正文

JavaWeb基础二(Servlet)

介绍

  • Servlet就是sun公司开发动态web的一门技术。
  • Sun公司在这些API中提供了一个接口:Servlet,如果像开发Servlet程序,只需要完成两个步骤。
    • 编写一个类,实现Servlet接口
    • 把开发好的Java类部署到web服务器中。

把实现了Servlet接口的Java程序叫做Servlet。

HelloServlet

Servlet接口Sun公司有两个默认的实现类:HttpServlet,GenericServlet

1.构建一个普通的Maven项目。

2.删除src文件。此后学习内容存放在项目下。这个空工程就是Maven主工程

3.导入Maven中Servlet的依赖。(可直接网上查找最新的)

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
    </dependencies>

4.创建子项目。

创建成功后,父项目中会自动生成

<modules>
    <module>servlet001</module>
</modules>

注:父项目中的Java子项目可以直接使用。

5.建立java与resources文件,详细见javaweb基础一篇。详细结构如

6.编写一个Servlet程序

  • 编写一个普通类        

  • 实现Servlet接口,这里直接继承HttpServlet接口

public class HelloServlet extends HttpServlet {
    //由于get与post只是请求实现的不同方式,可以相互调用,业务逻辑一样
    @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);
    }
}

7.编写Servlet的映射

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

在web.xml文件中配置映射

8.配置Tomcat

详细见上一节。

9.启动测试

Servlet原理

Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:

Mappint问题

1.一个Servlet可以指定一个映射路径

<!--Servlet的请求路径-->
<!--localhost:8080/s2/hello-->
<servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>/hello</url-pattern>
</servlet-mapping>

2.一个Servlet可以指定多个映射路径

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

3.一个Servlet可以指定通用映射路径

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

4.默认请求路径

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

5.指定一些后缀或者前缀等

添加后缀时,不能添加项目映射的路径,正确格式如下:

<servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>

6.优先级问题

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

ServletContext

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

共享数据

  • 在这个Servlet中保存的数据,可以在另外一个Servlet拿到数据。
  • 1.需要放置数据的类
  • //存储数据
    public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = this.getServletContext();
            String username="张三";
            context.setAttribute("username",username);//将数据保存在ServletContext中,(key,vlue),名字,值
        }
    }
  • 2.需要一个读取数据的类
  • //获取数据
    public class GetServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = this.getServletContext();//获取ServletContext对象
            String username = (String) context.getAttribute("username");//获取建,得到object类型,强制转化为String类型
            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);//在doPost里面调用doGet
        }
    }
  • 3.以及配置web.xml文件
  • <!--配置两个文件的请求路径-->
        <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.serenity.servlet.HelloServlet</servlet-class>
    </servlet>
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
        <servlet>
            <servlet-name>getc</servlet-name>
            <servlet-class>com.serenity.servlet.GetServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>getc</servlet-name>
            <url-pattern>/getc</url-pattern>
        </servlet-mapping>

    测试结果:

获取初始化参数

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

2.使用,编写一个类

3.在web.xml中配置新文件的请求路径。

    <servlet>
        <servlet-name>gp</servlet-name>
        <servlet-class>com.serenity.servlet.ServletDemo03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>gp</servlet-name>
        <url-pattern>/gp</url-pattern>
    </servlet-mapping>

运行结果为:

请求转发

1.编写一个请求转发的类

2.配置web.xml文件(每次想要实现前端,都需要配置,后期不重复)

结果显示:

原理:A想要从B页面请求到C页面的内容,由B页面向C页面发生请求,收到C页面的响应后,由B页面响应给A页面。


读取资源文件

Properties类:

  • 在Java目录下新建properties(需要在pom.xml中的build中配置resources,来防止我们资源导出失败的问题,具体代码可直接搜索)
  • 在resources目录下新建properties

两个资源创建时不同路径,但都会被打包在同一个路径下(classes),该路径被称为classpath

1.建立资源:在resources目录下创建文件

2.创建类

3.在web做映射

4.清除数据,重新加载项目

结果显示:

相关文章:

  • 项目上传到Gitee过程
  • Linux《基础开发工具(中)》
  • jenkins+ant+jmeter生成的测试报告空白
  • 选择排序算法OpenMP并行优化
  • 【编程题】7-5 堆中的路径
  • 理解C++模板库:依赖名
  • Dagger 2 系列(五)——进阶之@Scope 和 @Singleton
  • 《网络安全》中RSA加密算法的计算过程
  • Windows 图形显示驱动开发-WDDM 3.2-用户模式工作提交(三)
  • NFC标签读写开发指南
  • 《反脆弱》:从不确定性中获益的智慧✨
  • DHCP配置(二)— 接口模式
  • 【神经网络】python实现神经网络(二)——正向推理的模拟演练
  • 【Qt】成员函数指针
  • 【机器学习chp12】半监督学习(自我训练+协同训练多视角学习+生成模型+半监督SVM+基于图的半监督算法+半监督聚类)
  • ngx_openssl_module
  • 97.在 Vue 3 中使用 OpenLayers 根据两行根数 (TLE) 计算并显示卫星轨迹(EPSG:3857)
  • 特辣的海藻!9
  • 数据库基本建表操作
  • 介绍一下Qt 中的QSizePolicy 布局策略
  • 深圳市浩天建设网站/品牌营销策划网站
  • php网站建设外国参考文献/北京seo产品