java web

Java Web(2) 创建servlet

2020-07-09  本文已影响0人  loserwang_3030

[toc]

1. 简易demo

Servlet开发流程:

1.1. 创建应用

使用IDEA创建web应用(File->new->project->Java Enterprise):

webapplication.png
生成如下项目结构:
项目结构.png

1.2. 创建Servlet

在src中创建继承HttpServlet类的FirstServlet(然后右键->generate->override Method,可以直接选择父类HttpServlet的方法)


public class FirstServlet extends HttpServlet {

//service为请求处理的核心方法,无论是get还是post都会被service方法处理
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受请求发来的参数
        String name = req.getParameter("name");
        String html = "<h1 style='color:red'>hi," + name + "</h1><hr/>";
        PrintWriter out = resp.getWriter();
        out.println(html); //将htnl返回给浏览器
    }
}

1.3. 配置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">
    <display-name>FirstServlet</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <!-- 声明servlet -->
    <servlet>
        <!-- servlet的别名 -->
        <servlet-name>first</servlet-name>
        <!--servlet的包名-->
        <servlet-class>com.example.FirstServlet</servlet-class>
    </servlet>
    <!-- 将servlet与URL绑定-->
    <servlet-mapping>
        <servlet-name>first</servlet-name>
        <url-pattern>/hi</url-pattern>
    </servlet-mapping>
</web-app>

1.4. 启动应用

进行配置,然后点击run.


configurations.png

2. Tomcat部署

但是有一个问题,就是当项目部署后,我们打开tomcat的webapps目录下,并找不到生成的项目。如果在/tomcat/webapps找不到项目,tomcat怎么能启动项目的呢?这是因为我们使用的是idea
Tomcat部署有以下这些方式:

3. Java Web目录

3.1 Java Web工程目录

以IDEA为例:


idea中Java Web目录.png
组织结构 描述
/src 写Java代码的地方,如Servlet、JavaBean等
/out 项目的生成目录,可以通过Project Structure设置成其他地方,放在 tomcat/webapps下可直接访问
/web 用来存放 JSP,JS,CSS,图片等文件,是项目访问的默认路径
/web/WEB-INF WEB应用的安全目录,用于存放配置文件
/web/WEB-INF/web.xml web.xml是Web项目核心配置文件
/web/WEB-INF/lib 用于存放web应用依赖的jar文件,一般将外部jar放到此处,刷新后就可以在/src中使用

3.2 Tomcat应用目录

tomcat部署应用的目录如下:

组织结构 描述
tomcat安装目录/webapps Tomcat应用根目录
/web应用目录 Java Web 应用目录
/web应用目录/index.html or index.jsp 默认首页(可以在web.xml指定首页)
/web应用目录/WEB-INF WEB应用的安全目录,外部不能访问 ,用于存放配置文件
/web应用目录/WEB-INF/web.xml web.xml是“部署描述符文件”,是该Web项目核心配置文件
/web应用目录/WEB-INF/classes 存放编译后的classes文件
/web应用目录/WEB-INF/lib 用于存放web应用依赖的jar文件
/web应用目录/META-INF/MANIFEST.MF 包含Web应用的版本等信息

3.1 Java Web工程目录转化为Tomcat应用目录

当我们在IDEA中点击运行时, Java Web工程目录会被转化为Tomcat能够运行的目录结构。


生成目录.png

我们会发现生成的应用目录LoginServlet和工程目录的/web大体一致,除了WEB-INF外的其他部分不变。
工程项目中的/src中的Java代码会被编译成class,存放到LoginServlet/WEB-INF/classes中。
/web中的内容会在应用目录LoginServlet/WEB-INF/classes/web中备份一份。

4. Get与Post请求

4.1 Get请求

4.2 Pos请求

4.3 处理Get和Post

两者到服务器获取的parameter没区别。
service为请求处理的核心方法,无论是get还是post都会被service方法处理。
如何分别处理getpost?

public class RequestMethodServlet extends HttpServlet {
    //处理get请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        resp.getWriter().println("<h1 >" + name + "</h1>");
    }
    //处理post请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        resp.getWriter().println("<h1>" + name + "</h1>");
    }
}

5. Servlet生命周期

与 CGI 的区别在于,Servlet 处于服务器进程中,它通过多线程方式运行其 service 方法,一个实例可以运行多个请求,并且其实例一般不会销毁,而 CGI 对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于 Servlet。


servlet生命周期.jpg

6.注解简化配置

随着项目的扩大,web.xml会越来越长,难以维护,每次修改Servlet都要修改相应的web.xml的内容。Servlet3.0之后引入了注解annotation来简化配置。
Servlet的核心注解为@WebServlet

package com.example;
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;

@WebServlet("/first")
public class FirstServlet extends HttpServlet {
//service为请求处理的核心方法,无论是get还是post都会被service方法处理
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受请求发来的参数
        String name = req.getParameter("name");
        String html = "<h1 style='color:red'>hi," + name + "</h1><hr/>";
        PrintWriter out = resp.getWriter();
        out.println(html); //将htnl返回给浏览器
    }
}

7.启动时加载Servlet

servlet一般在第一次请求后进行初始化,通过启动时加载 可以提前加载servlet。通常重写init()方法,进行项目的一些预处理。

7.1 web.xml

web.xml使用<load-on-startup>设置启动加载。启动时加载在工作中常用于系统的预处理。(预处理可以时实际工作时效率更高)

<!-- 0优先级最高-->
<load-on-startup>0~9999</load-on-startup>

7.2 annotition注解

@WebServlet(urlPatterns = "/unused", loadOnStartup = 2)
public class RequestMethodServlet extends HttpServlet { //...}

8.ServletContext和ServletConfig

8.1 .ServletConfig

在运行 Servlet 程序时,可能需要一些辅助信息,例如,文件使用的编码、使用 Servlet 程序的共享信息等,这些信息可以在 web.xml 文件中使用一个或多个 <init-param> 元素进行配置。当 Tomcat 初始化一个 Servlet 时,会将该 Servlet 的配置信息封装到 ServletConfig 对象中,此时可以通过调用 init(ServletConfig config)方法将 ServletConfig 对象传递servlet。

xml
<servlet>
  <servlet-name>Servlet1</servlet-name>
  <servlet-class>com.Servlet1</servlet-class>
  <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
  </init-param>
</servlet>
//ava
 ServletConfig config = this.getServletConfig();
 String param = config.getInitParameter("encoding");

8.2 .ServletContext

当 Tomcat 启动时,Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象代表当前的 Web 应用,该对象封装了当前 Web 应用的所有信息。可以利用该对象获取 Web 应用程序的初始化信息、读取资源文件等。

learn more

这里只是简要介绍以下Sevlet,具体可以参考:

上一篇下一篇

猜你喜欢

热点阅读