首页 > 编程语言 >javaweb项目搭建及Servlet用法

javaweb项目搭建及Servlet用法

时间:2023-07-25 21:25:12浏览次数:28  
标签:javaweb Servlet void 用法 Override import servlet public

一.Javaweb

1.常见软件系统体系结构

1.C/S架构

C/S结构即客户端/服务器(Client/Server),例如QQ

需要编写服务器端程序,以及客户端程序,例如我们安装的就是QQ的客户端程序;

缺点:软件更新时需要同时更新客户端和服务器端两端,比较麻烦;

优点:安全性比较好。

2.B/S架构

B/S结构即浏览器/服务器(Browser/Server);

优点:只需要编写服务器端程序,不需要安装专门的客户端软件,只需要浏览器就行;

缺点:安全性较差。

2.web资源

Web(World Wide Web) 称为万维网,简单理解就是网站,它用来表示Internet主机上供外界访问的资源。

Internet上供外界访问的资源分为:

  • 静态资源
  • 动态资源

1.静态资源

供人们浏览的数据始终是不变;

浏览器能直接看懂

例如:HTMLCSSJavaScript、各种图片

2.动态资源

供人们浏览的数据是由程序产生的,不同时间点访问WEB页面看到的内容各不相同。

客户端请求的页面如果是静态网页,那么服务器会直接把静态网页的内容响应给客户端。如果客户端请求的是动态网页,服务器需要先把动态网页转换成静态网页,然后再把转换后的静态网页响应给客户端。

注:从广义上讲,用户看到的都是静态网页。

例如:ServletJSPASPPHP,但是在Java里面只涉及JSP/Servlet

在Java中,动态web资源开发技术统称为JavaWeb

3.web服务器

Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问。

1.常见web服务器

开源:

  • Tomcat:主流Web服务器之一,适合初学者
  • Jetty:运行效率比Tomcat
  • Resin:所有开源服务器软件中,运行效率最高的
  • 三者的用法从代码角度完全相同,只有在开启、关闭服务器软件时对应的命令稍有区别。掌握一个即掌握所有

收费:

  • WebLogicOracle
  • WebSphereIBM
  • 提供相应的服务与支持,软件大,耗资源

2.Tomcat

TomcatApache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,免费开源、并支持ServletJSP规范。目前Tomcat最新版本为9.0

Tomcat技术先进、性能稳定,深受Java爱好者喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。

二.Servlet

1.配置

1.IDEA集成Tomcat

image-20210906003847048

image-20210906004013585

image-20210906004049383

2.IDEA创建Web项目

1.新建普通Java项目

image-20210906002401086

注意:Idea2020无法直接新建JavaWeb项目,只能通过新建普通Java项目的方式间接新建JavaWeb项目。

选择项目位置和普通Java项目相同,此处略过。

2.修改普通Java项目为JavaWeb项目

项目根目录->右键->Add Framework Support

image-20210906002811360

选择JavaEE版本image-20210906002948105

勾选左侧的Web Application

image-20210906003126293

完成之后,可以看到项目下新建了web目录,并包含如下内容。

image-20210906003250782

添加相关依赖File->Project Structure

image-20210906004437099

image-20210906004525203

image-20210906004613241

执行上述操作之后,Tomcat相关Jar包就添加到了项目中,不添加后续很多开发无法进行。

3.项目部署

此处指的是将Idea中开发的Web项目在Tomcat中部署。

image-20210906005147219

image-20210906005254292

image-20210906005402507

image-20210906005602709

修改index.jsp的代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Index</title>
  </head>
  <body>
      <%
		String name = "张三";
		out.print("<p>" + name + "</p>");
	  %>
      <p>Hello JavaWeb</p>
  </body>
</html>

4.项目运行

单击运行按钮,运行项目,默认会在浏览器中打开index.jsp

image-20210906010314577

在以后的开发中,多数时候都是重复上述步骤进行JavaWeb项目的开发。

2.简介

Server Applet(服务器小程序),是由服务器端调用和执行的、按照Servlet自身规范编写的Java类。

JavaWeb的三大组件(ServletFilterLisener)之一,是动态资源的一种。

作用:

  • 接收请求
  • 处理数据
  • 完成响应

后续我们学习Servlet也是集中在这三点。

3.实现Servlet的三种方式

Servlet是单例的,一个类型的Servlet只有一个实例对象,那么就有可能会出现一个Servlet同时处理多个请求,Servlet不是线程安全的,不应该在Servlet中创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程对这个成员变量进行读操作。

  • 不要在Servlet中创建成员,创建局部变量即可;
  • 可以创建无状态成员;
  • 可以创建有状态的成员,但状态必须为只读的。

1.实现Servlet接口

javax.servlet.Servlet代码

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;
    ServletConfig getServletConfig();
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    String getServletInfo();
    void destroy();
}

Servlet中的大多数方法不由我们来调用,而是由Tomcat来调用,并且Servlet的对象也不由我们来创建,由Tomcat来创建!

生命周期方法

  • init()
    
    • 服务器会在Servlet第一次被访问时创建Servlet,在Servlet被创建后,服务器会马上调用Servletvoid init(ServletConfig)方法;
    • 在整个Servlet的生命周期中,该方法只被调用一次。
  • service()
    
    • 当服务器每次接收到请求时,都会去调用Servletservice()方法来处理请求;
    • 每次处理请求都会被调用
  • destroy()
    
    • 在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servletdestroy()方法;
    • 在整个Servlet的生命周期中,该方法只被调用一次。

生命周期方法方法演示

package tech.code2048.servlet;

import javax.servlet.*;
import java.io.IOException;

public class BServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init...");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service...");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destroy...");
    }
}

web.xml中配置Servlet

<servlet>
    <servlet-name>bServlet</servlet-name>
    <servlet-class>tech.code2048.servlet.BServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>bServlet</servlet-name>
    <url-pattern>/bServlet</url-pattern>
</servlet-mapping>

启动tomcat->访问BServlet->关闭tomcat

观察控制台的打印。

关于ServletConfig

  • 一个ServletConfig对象对应一段web.xml中的配置信息
  • ServletConfig是一个接口,该接口实现类的对象由Tomcat提供
  • 方法
    • getInitParameter(name) 获取servlet的初始化参数
    • getInitParameterNames()
    • getServletContext()
    • getServletName()

修改BServlet代码

package tech.code2048.servlet;

import javax.servlet.*;
import java.io.IOException;

public class BServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init...");
        System.out.println(servletConfig.getInitParameter("name"));
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service...");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("destroy...");
    }
}

修改web.xml关于BServlet的配置

<servlet>
    <servlet-name>bServlet</servlet-name>
    <servlet-class>tech.code2048.servlet.BServlet</servlet-class>
    <!-- BServlet初始化参数 -->
    <init-param>
        <param-name>name</param-name>
        <param-value>zhangsan</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>bServlet</servlet-name>
    <url-pattern>/bServlet</url-pattern>
</servlet-mapping>

2.继承GenericServlet

GenericServlet使编写Servlet变得更容易。它提供生命周期方法initdestroy的简单实现,要编写一般的Servlet,只需重写抽象service方法即可。

代码如下:

package tech.code2048.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class CServlet extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("CServlet....");
    }
}
web.xml`配置`CServlet
<servlet>
    <servlet-name>cServlet</servlet-name>
    <servlet-class>tech.code2048.servlet.CServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>cServlet</servlet-name>
    <url-pattern>/cServlet</url-pattern>
</servlet-mapping>

3.继承HttpServlet

HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet

HttpServletservice(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()doPost()方法即可。

package tech.code2048.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

public class DServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet.......");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost........");
    }
}
web.xml`配置`DServlet
<servlet>
    <servlet-name>dServlet</servlet-name>
    <servlet-class>tech.code2048.servlet.DServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dServlet</servlet-name>
    <url-pattern>/dServlet</url-pattern>
</servlet-mapping>

4.配置Servlet的两种方式

1.web.xml方式

Servlet2.5及之前使用该方式

<!-- 1、添加servlet节点 -->
<servlet>
    <!-- Servlet的名字,和2中的名字必须一致 -->
    <servlet-name>aServlet</servlet-name>
    <!-- Servlet的全类名 -->
    <servlet-class>tech.code2048.servlet.AServlet</servlet-class>
    <!-- 配置启动加载 -->
    <load-on-startup>1</load-on-startup>
</servlet>
<!-- 2、添加servlet-mapping节点 -->
<servlet-mapping>
    <!-- Servlet的名字,和1中的名字必须一致 -->
    <servlet-name>aServlet</servlet-name>
    <!-- Servlet的访问路径,通过该路径可以访问doServlet的Get或doPost方法 -->
    <url-pattern>/aServlet</url-pattern>
</servlet-mapping>

url-pattern定义匹配规则,取值说明:

  • 精确匹配/具体的名称只有url路径是具体的名称的时候才会触发Servlet
  • 后缀匹配 *.xxx只要是以xxx结尾的就匹配触发Servlet
  • 通配符匹配 /*匹配所有请求,包含服务器的所有资源
  • 通配符匹配/匹配所有请求,包含服务器的所有资源,不包括jsp
load-on-startup
  • 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet
  • 它的值必须是一个整数,表示Servlet被加载的先后顺序;
  • 如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载;
  • 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个Servlet,值越小,Servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。

2.注解方式

Servlet3.0新增特性,推荐使用

@WebServlet常用属性:

  • nameServlet名字,可选
  • value:配置url路径,可以配置多个
  • urlPatterns:配置url路径 ,和value作用一样,不能同时和value使用
  • loadOnStartup:配置Servlet的创建的时机, 如果是0或者正数,启动程序时创建,如果是负数,则访问时创建。 数子越小优先级越高。
package tech.code2048.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "EServlet", value = "/eServlet", loadOnStartup = 1)
public class EServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet...");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost...");
    }
}

5.常见问题

  1. HTTP Status 404
    

    资源找不到

    • 第一种情况:地址书写错误;
    • 第二种情况:地址没有问题,把IDEA项目中out目录删除,然后重新运行。
  2. Servlet地址配置重复,多个Servleturl-pattern使用相同的值

  3. Servlet地址配置错误,比如没有写/

标签:javaweb,Servlet,void,用法,Override,import,servlet,public
From: https://www.cnblogs.com/AaaalexQaQ/p/17581035.html

相关文章

  • Navigation的用法
    一.Navigation的诞生单个Activity嵌套多个Fragment的UI架构模式,已经被大多数的Android工程师所接受和采用。但是,对Fragment的管理一直是一件比较麻烦的事情。我们需要通过FragmentManager和FragmentTransaction来管理Fragment之间的切换。页面的切换通常还包括对应用程序App......
  • 正则表达式中test、exec、match的区别介绍及括号的用法
    test、exec、match的简单区别1、testtest返回Boolean,查找对应的字符串中是否存在模式。varstr="1a1b1c";varreg=newRegExp("1.","");alert(reg.test(str));//true2、execexec查找并返回当前的匹配结果,并以数组的形式返回。 varstr="1a1b1c";varreg=newReg......
  • easy-ui展开行配置用法(两种)
    第一种:用expand属性<easy-custom-tablerowKey="id":expand="expand"//添加expand属性,属性值为一个对象:tableData="tableData":columns="columns":maxHeight="tableHeight":headerCellSty......
  • Java后端01(初识servlet)
    servlet添加依赖坐标(maven)<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency>小测试​ 所有请求都会固定携带一个参数(method)代表请求的方式(GET,POST,PUT,D......
  • JavaWeb--环境搭建(idea,tomcat)到跑测试中我犯下的滔天大罪
    1.在网上copy时路径没有写对点击查看代码<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation......
  • 老杜 JavaWeb 讲解(十四) ——JSP+Servlet改造oa项目
    (十四)JSP改造oa项目相关视频:38-Servlet和JSP改造oa项目使用Servlet+JSP完成oa项目的改造使用Servlet处理业务,收集数据。使用JSP展示数据。将之前原型中的html文件,全部修改为jsp,然后在jsp文件头部添加page指令(指定contentType防止中文乱码),将所有的JSP直接拷贝到web......
  • Day08_for循环+print补充用法
    1.for循环和while循环取值: 2.for循环字典: 3.for循环字符串: 4.总结for循环和while循环的异同: 5.for循环控制循环次数:range() 6.for+break和for+else: 7.range(): 8.for+continue: 9.for循环嵌套: 10.print补充用法: ......
  • this.$nextTick的用法
    一、总述定义:在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,回调函数获取更新后的dom再渲染出来;$nextTick类似于一个非常高级的定时器,自动追踪DOM更新,更新好了就触发语法:this.$nextTick(回调函数),例如://修改按钮操作updateCateBtnFn(obj){......
  • vue中ref的用法
    1,可以引用元素,通过this.$refs.domxx直接操作元素。<divref="domxx"></div>methods:{getxx(){console.log(this.$refs.domxx)//访问DOM元素}}2,可以绑定组件实例,访问组件的属性和方法;参考地址:(22条消息)Vue中ref的用法_我心向阳.的博客-CSDN博客Templ......
  • 2.进程相关命令用法
    ListingProcessesProcesses相关命令的用法psauxaux是参数,不用加扩折号。ps-efvboxuser53774706015:59pts/000:00:00ps-efpgrep-lprocess'sname作用是检索进程id,同时显示进程name。forexample:inbash:pgrep-lsshd696sshdtoptop命令查......