Servlet服务器

本文详细介绍了Servlet的概念、特点,以及Servlet的运行过程。在Servlet生命周期中,讲解了init、service、doGet和doPost等关键方法。此外,还阐述了Tomcat服务器的配置、Web项目发布和Servlet配置等内容,帮助读者理解并掌握Servlet开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Servlet的概念和特点

Servlet简介:

           实现了特殊接口的java类。此类tomcat服务器是认识的。

           是一种服务器端编程技术。

           由支持Servlet的Web服务器调用和启动运行

           一个Servlet负责对应的一个或者一组URL访问请求,并返回相应的响应内容。

 

特点:

           Servlet由程序员创建,但是由服务器调用执行。

 

总结:

           1、Servlet其实就是一个服务器可以识别的java类

           2、我们需要将业务逻辑处理规则放入Servlet中

           3、然后将Servlet放入Tomcat服务器中

           4、服务器根据请求调用对应的Servlet处理

           5、Servlet可以称为后台处理程序的入口

动态网页

           以数据库技术为基础

           不是独立存在于服务器上的网页文件

B/S和C/S架构

C/S:

           client/server:客户机和服务器架构

B/S:

           Browser/server:浏览器和服务器架构

C/S和B/S架构比较

           

 

服务器负荷

维护升级成本

B/S

C/S

Servlet运行过程

浏览器发送请求到服务器

服务器根据请求的url,去调用相应的serlvet类。

通过servlet中的打印流对象将生成的HTML数据输出给服务器。

服务器将servlet生成的数据再输出给客户端浏览器

第一个Web项目

新建web项目

          new Web Project

建包

          com.xjion.action

新建class:HelloServlet

          继承:HttpServlet(javax.servlet.HttpServlet)

重写service方法(两个service方法中带HttpServletRequest、HttpServletResponse参数的)

package com.xjion.action;

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

public class HelloServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("Hello,girl!!!!");
	}
}

在web.xml配置写好的servlet

访问一个servlet程序的过程:

          浏览器发送一个URL

          服务器根据收到的url,调用相应的servlet程序

配置Servlet的两个作用:

          让服务器知道这个Servlet类的存在

          让URL和Servlet匹配,从而来了新的请求方法

<servlet>
	<servlet-name>first</servlet-name>
	<servlet-class>com.cssxt.xjion.HelloServlet</servlet-class>
</servlet>
 
<servlet-mapping>
	<servlet-name>first</servlet-name>
	<url-pattern>/one</url-pattern>
</servlet-mapping>  

servlet-name需要保持一致,需要映射

url-pattern必须以/开头,除了*开头

安装和启动tomcat服务器

将TOMCAT压缩包解压。

设置环境变量: JAVA_HOME: C:\Program Files\Java\jdk1.5.0_11

进入TOMCAT子目录bin,点击:startup.bat,启动tomcat.

访问:http://localhost:8080/

如果出现tomcat主页,则安装成功。

手动发布项目:

在tomcat子目录:webapps中新建一个文件夹:gg

将web项目的WebRoot目录中所有的内容copy到gg中.

重启tomcat

访问刚刚写好的Servlet:

http://localhost:8080/gg/one

http://127.0.0.1:8080/gg/one

http://自己机器的ip:8080/gg/one

Myeclipse中集成tomcat

进入配置选项(windowpreferencemyeclipseapplication serverstomcattomcat6)

在Myeclipse中自动发布web项目

Tomcat目录结构

/bin          存放tomcat命令

shutdown和startup负责启动和关闭服务器 

修改catalina可以设置tomcat的内存

/conf          负责管理配置文件,常用的有web.xml和server.xml

server.xml可以设置端口号、域名或IP、默认加载的项目、请求编码 
web.xml可以设置tomcat支持的文件类型 
context.xml可以用来配置数据源之类的 
tomcat-users.xml用来配置管理tomcat的用户与权限 
在Catalina目录下可以设置默认加载的项目

/lib          存放tomcat运行需要加载的jar包

/logs          存放在运行过程中产生的日志文件,非常重要的是在控制台输出的日志

/temp          用来存放tomcat在运行过程中产生的临时文件

/webapps          用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序

/work          用来存放tomcat在运行时编译生成的class和java文件

清空work目录,然后重启tomcat可以清除缓存

发布web项目的两种常用方式

发布按钮(或者说,通过将项目内容copy到tomcat/webapps/目录下)

          发布:直接点击"发布按钮"将开发项目发布到tomcat目录webapps/下面

          访问:项目名+<url-pattern>

server.xml(该文件描述了tomcat如何启动服务,即启动时如何加载相关组件)

          发布:在server.xml中<Host>下面增加一个<Context>元素:

          <Context path="/ab"  docBase="D:\workspace3066\java310\WebRoot" reloadable="true" />

          访问:path属性+<url-pattern>

Servlet配置详解

<url-pattern>的问题

必须以/开头(不然,启动 是会报错:invalid url-pattern ** in servlet mapping)

常见的url 的模式:

          <url-pattern>/one/*</url-pattern>匹配所有one下面的请求

          <url-pattern>/one</url-pattern>匹配one请求

          <url-pattern>*.one </url-pattern>匹配所有.one结尾的请求

错误写法:<url-pattern>/yi/*.one</url-pattern>

          一个<servlet>可以对应多个<servlet-mapping>,即多个url可以对应一个serlvet

分析:

          tomcat启动报错,一般情况都是项目的配置文件出错,可以通过查找case by 语句得到相关信息。

Servlet的生命周期

结论:

从第一次被调用到服务器关闭

验证:

init方法:servlet被初始化创建的时候调用
service方法:处理请求的时候
destory方法:servlet被销毁的时候。
当服务器关闭的时候销毁servlet,触发destroy方法的执行

注意:

我们可以在web.xml中配置load-on-startup来设置Servlet的加载时机为服务器启动。
生命周期就变为从服务器开启到服务器关闭。

package com.xjion.servlet;

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


@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("我被初始化了");
    }

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

    @Override
    public void destroy() {
        System.out.println("我被销毁了");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
           version="3.0">
    <servlet>
        <servlet-name>se</servlet-name>
        <servlet-class>com.xjion.action.Servlet</servlet-class>
        <load-on-startup>1</load-on-startup> <!--配置servlet服务器启动时完成加载和初始化创建-->
    </servlet>
    <servlet-mapping>
        <servlet-name>se</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

doGet,doPost,service,init,destory方法的区别

doGet

         处理doGet的请求

doPost

         处理doPost的请求

service

         无论什么请求方式服务器都会优先执行service方法

         执行顺序:

                   servlet(公共的)   

                   httpServlet(受保护的)

init

         当servlet对象被初始化之后会调用init方法

destroy

         当servlet对象在销毁之前会调用destroy方法

注意

servlet中没有声明service方法,会根据请求方式调用对应的方法进行请求处理,如果在servlet中没有声明对应的请求处理方法,则会报405错误。

tomcat服务器其实只认识service方法,如果我们自己声明的servlet中没有覆写service方法,则会执行HttpServlet中的sercice方法,而该方法会根据请求方法调用对应的doXX()方法执行请求处理
 

package com.xjion.action;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LifeServlet extends HttpServlet{
	/**
	 * 当servlet对象在销毁之前会调用destroy方法
	 */
	@Override
	public void destroy() {
		System.out.println("servlet销毁了");
	}

	/**
	 * 当servlet对象被初始化之后会调用init方法
	 */
	@Override
	public void init() throws ServletException {
		System.out.println("servlet初始化了");
	}
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("受保护的service方法");
		super.service(req, resp);
	}

	@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方法...");
	}

	@Override
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		System.out.println("公共的service方法 ");
		super.service(req, res);
	}
}

Servlet的常见错误总结:

Servlet的常见错误:

404错误:资源未找到

原因一:在请求地址中的servlet的别名书写错误。
原因二:虚拟项目名称拼写错误

500错误:内部服务器错误

错误一:java.lang.ClassNotFoundException
解决:在web.xml中校验servlet类的全限定路径是否拼写错误。
错误二:因为service方法体的代码执行错误导致。
解决:根据错误提示对service方法体中的代码进行错误更改

405错误:请求方式不支持

原因:请求方式和servlet中的方法不匹配所造成的。
解决:尽量使用service方法进行请求处理,并且不要在service方法中调用父类的service.

request对象

package com.xjion.action;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		testRequestLine(request);
		testRequestHeader(request);
		testRequestNetMsg(request);
	}

	/**
	 * 测试请求行信息
	 */
	public void testRequestLine(HttpServletRequest request){
		//获取请求方式
		String method=request.getMethod();
		System.out.println("method:"+method);
		
		//获取?之前端口号之后
		String uri=request.getRequestURI();
		System.out.println("uri:"+uri);
		
		//获取?之前所有
		String url=request.getRequestURL().toString();
		System.out.println("url:"+url);
		
		//获取?之后内容
		String queryString=request.getQueryString();
		System.out.println("queryString:"+queryString);
		
		//获取协议名
		String scheme=request.getScheme();
		System.out.println("scheme:"+scheme);
		
		//获取根目录
		//注意:  结果是    /根目录名                         
		String contextPath=request.getContextPath();
		System.out.println("contextPath:"+contextPath);
		
	}
	
	/**
	 * 测试请求的头信息获取
	 */
	public void testRequestHeader(HttpServletRequest request){
		//request.getHeader(键名)
		//不区分大小写
		String conn=request.getHeader("Connection");
		System.out.println("conn:"+conn);
		
		String acceptLanguage=request.getHeader("ACCEPT-language");
		System.out.println("acceptLanguage:"+acceptLanguage);
	}
	
	
	/**
	 * 获取网络信息
	 */
	public void testRequestNetMsg(HttpServletRequest request){
		//获取服务器信息
		String addr1=request.getLocalAddr();
		int port1=request.getLocalPort();
		System.out.println("服务器ip地址:"+addr1);
		System.out.println("服务器端口号:"+port1);
		
		//获取客户端信息
		String addr2=request.getRemoteAddr();
		int port2=request.getRemotePort();
		System.out.println("客户端ip地址:"+addr2);
		System.out.println("客户端端口号:"+port2);
		
	}
	
	
}
package com.cdsxt.action;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestServlet2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * 获取表单参数
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取单键单值的表单参数
		//request.getParameter(键名)
		//注意:
		//如果获取的是一个连键都没有的值,则结果是null,获取一个只有键没有值则结果是空字符串。
		String a=request.getParameter("a");
		String b=request.getParameter("b");
		String name=request.getParameter("name");
		System.out.println(a+"----"+b+"----"+name);
	}

}

response对象

package com.xjion.servlet;

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


/**
 * resp对象之处理响应学习
 *      设置响应行:协议 状态码 状态消息
 *          resp.sendError(int status);
 *          作用:可以自主的响应状态给浏览器
 *      设置响应头:
 *          addHeader(String name,String value) 添加响应头信息,同名数据不会覆盖
 *          setHeader(String name,String value) 设置响应头信息,会覆盖原有信息。如果没有此响应头则添加该信息
 *      设置响应实体(处理结果):
 *          resp.getWriter().write("实体内容")
 *          注意:
 *              实体内容可以分开进行响应。
 * 注意:
 *      一旦使用resp对象作出了请求响应,则意味着此次请求处理完毕。服务器在响应后会将此次请求相关的req对象和resp对象销毁。
 */
@WebServlet(name = "ResponseServlet")
public class ResponseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求数据
        //处理请求数据
        //响应处理结果
            //设置响应行
                //自定义响应404异常
                    //resp.sendError(404);
            //设置响应头
                //添加响应头信息
                    resp.addHeader("mouse","thinkpad");
                    resp.addHeader("mouse","thinkpad2");
                //设置响应头
                    resp.setHeader("mouse","two fly birds");
            //设置响应实体
                    resp.getWriter().write("resp object");
                    resp.getWriter().write("resp object");
    }
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值