tomcat使用,servlet

javaWeb

一、课程目标

【掌握】tomcat安装配置
【掌握】tomcat发布静态项目
【理解】servlet接口
【掌握】HttpServlet使用

二、tomcat安装配置

tomcat提供了多平台解压与安装版

Tomcat下载

在这里插入图片描述

解压版:直接解压基本配置已经配置完成,需要根据系统与位数选择解压安装指定的版本,由于解压版不知道是在window还是linux使用,所以提供了两个对应的执行脚本

安装版:只需要选择系统,在安装的过程中会自动进行位数的匹配,安装版需要在安装过程中手动填写配置

目录

目录用途
/bin存放启动和关闭Tomcat的脚本
/conf存放Tomcat的各种配置文件
/lib存放Tomcat服务器和所有web程序需要访问的jar文件
/logs存放Tomcat的日志文件
/temp存放Tomcat运行时产生的临时文件
/webapps当发布web应用程序时,通常把web程序放置到该目录下
/workTomcat将JSP生成的Servlet源文件和字节码文件放置到该目录下

tomcat安装配置注意事项:

1、tomcat基于java运行环境所以必须在配置环境变量之后进行安装

2、安装版需要手动配置相关配置

3、可以通过conf目录进行配置的修改

三、发布静态项目

我们有一个静态网站,假设网站的项目名字叫sms,现在将它发布到Tomcat中去需要以下步骤:
步骤一:在webapps目录下新建一个sms目录
步骤二:将我们的静态网页复制粘贴到sms目录下
步骤三:启动服务器,在浏览器中输入http://localhost:8080/sms/index.html

四、servlet

4.1 创建动态web工程

4.1.1 eclipse创建web工程

右键new->project输入web

在这里插入图片描述

选择Dynamic Web Project点击next

在这里插入图片描述

Project name:项目名

Target tuntime:运行服务器实例(这个项目交由那个服务器对象运行)

Dynamic web modle version:创建项目模板版本2.5或3.0之后的版本

文件目录

在这里插入图片描述

java Resources:存放java使用的资源(服务器处理资源)

WebContent:存放的是网页资源与tomcat服务器运行当前项目资源

src:存放书写的java代码与配置文件

lib:存放项目运行时使用的额外的jar包(注意:web项目只需要将jar包粘贴进来会自动进行导入,无需手动导入)

4.1.2 idea创建web工程

idea没有像eclispe直接创建使用的模板,都需要在创建后进行配置

new project选择java Enterprise 选择已经配置好的tomcat服务

创建普通java项目后添加web

在这里插入图片描述

在WEB-INF下分别创建文件夹

在这里插入图片描述

classes:存放编译后的代码

lib:存储项目运行时使用的jar包

创建后进行文件夹标识设置

在这里插入图片描述

将当前项目输出位置改为指定位置(classes不创建不配置也可以)

在这里插入图片描述

将lib目录添加到当前项目使用的资源位置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.2 概念

在服务器端运行的用于处理用户请求并给予相应的java代码

servlet是一个接口,任何实现这个接口的类都可以进行服务的处理与响应

需要tomcat的支持与额外的配置进行一同调用

生命周期方法:
void init(ServletConfig config) 用于初始化Servlet
void service(ServletRequest req ,ServletResponse resp) 用于处理用户请求且做出响应
void destroy() 用于从容器中销毁该Servlet实例

获取该Servlet对应的ServletConfig

ServletConfig getServletConfig() 返回该Servlet对应的配置对象

获取Servlet的信息

String getServletInfo() 用于获取Servlet的信息,如:作者,版本等内容

4.3 使用servlet接口实现服务的处理

1、书写类实现servlet接口 重写相应方法

package com.yunhe.servlet;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyServlet implements Servlet{

	@Override//销毁方法   servlet销毁时执行
	public void destroy() {
		 System.out.println("销毁");
		 
	}

	@Override//获取servlet配置方法  一般用于获取配置文件中配置的数据
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override//获取servlet信息方法  一般用于获取servlet版本  作者等信息
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		 System.out.println("初始化创建");
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		 System.out.println("服务被调用");
	}

}

2、在web.xml进行当前服务的配置

	<!-- 用于配置servlet使其在服务器启动时进行加载并进行使用 -->
	<!-- 配置一个servlet服务并指定代码位置与名字 名字可以随便起但注意不要与其他servlet配置重名 -->
	<servlet>
		<servlet-name>myServlet</servlet-name>
		<servlet-class>com.yunhe.servlet.MyServlet</servlet-class>
	</servlet>

	<!-- 配置servlet服务地址 -->
	<!-- 配置指定地址与已经配置好的servlet之间的关系 -->
	<servlet-mapping>
		<servlet-name>myServlet</servlet-name>
		<url-pattern>/myservlet</url-pattern>
	</servlet-mapping>

4.4 使用GenericServlet抽象类实现服务的处理

GenericServlet不仅帮我们实现了servlet接口中的部分方法同样实现了序列化接口

1、书写类继承GenericServlet实现相应服务处理方法,如果想进行其他方法可以使用重写

package com.yunhe.servlet;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyServlet2 extends GenericServlet{
	private static final long serialVersionUID = -879916588354250592L;

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		 System.out.println("GenericServlet实现");
	}

}

2、在web.xml进行当前服务的配置

	<!-- 用于配置servlet使其在服务器启动时进行加载并进行使用 -->
	<!-- 配置一个servlet服务并指定代码位置与名字 名字可以随便起但注意不要与其他servlet配置重名 -->
	<servlet>
		<servlet-name>myServlet2</servlet-name>
		<servlet-class>com.yunhe.servlet.MyServlet2</servlet-class>
	</servlet>

	<!-- 配置servlet服务地址 -->
	<!-- 配置指定地址与已经配置好的servlet之间的关系 -->
	<servlet-mapping>
		<servlet-name>myServlet2</servlet-name>
		<url-pattern>/myservlet2</url-pattern>
	</servlet-mapping>

4.5 使用Httpservlet抽象类实现服务的处理

之前的servlet书写都是使用serive方法进行服务的统一处理,但是对于http协议的请求而言,请求的方式有7种,所以sun公司针对于http协议的servlet进行封装提供了HttpServlet进行不同请求的处理

HTTP请求方法HttpServlet对应的处理方法
GETdoGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException
POSTdoPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException
HEADdoHead(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException
PUTdoPut(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException
DELETEdoDelete(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException
TRACEdoTrace(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException
OPTIONSdoOptions(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException

1、书写类继承httpservlet重写需要实现的方法

package com.yunhe.servlet;

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 MyHttpServlet extends HttpServlet {

	// 通过重写相应处理方法进行服务的书写
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		 System.out.println("get请求执行");
	}
}

2、配置web.xml文件

  <servlet>
    <servlet-name>myServlet3</servlet-name>
    <servlet-class>com.yunhe.servlet.MyHttpServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>myServlet3</servlet-name>
    <url-pattern>/myservlet3</url-pattern>
  </servlet-mapping>

可以通过eclipse提供的模板快速创建servlet并自动进行xml的配置

五、HttpServletRequest

5.1 概念

将客户端的请求数据封装为一个类,每次请求创建一个请求对象,HttpServletRequest就是针对于http请求数据创建的数据对象(可以获取客户端发送的数据)继承自javax.servlet.ServletRequest接口

5.2 常用方法

从ServletRequest继承而来的常用方法有:

方法用途
getAttribute(String name)获取属性值
setAttribute(String name, Object o)设置属性值
getCharacterEncoding()获取字符编码集
setCharacterEncoding(String env)设置字符编码集
getParameter(String name)获取参数的值
getParameterValues(String name)获取参数的多个值
getRemoteAddr()获取客户端IP地址
getRequestDispatcher(String path)构建一个转发对象
方法用途
getCookies()获取cookie数组
getHeader(String name)获取HTTP请求头信息
getRequestURL()获取URL
getQueryString()获取QueryString
getSession()获取或构建会话

六、HttpServletResponse

6.1 概念

将服务器端的响应数据封装为一个类,对于客户端的每次请求创建一个响应对象,HttpServletResponse就是针对于http请求数据后响应创建的数据对象(可以将服务器端数据发送给客户端)继承自javax.servlet.ServletResponse接口

6.2 常用方法

HttpServletResponse提供了一些HTTP响应常用的方法:

方法用途
setContentType(String type)设置内容类型
addCookie(Cookie cookie)设置客户端Cookie
setHeader(String name,String value)设置响应头信息
sendRedirect(String location)设置跳转页面

七、ServletContext与ServletConfig

基本用于一些配置与配置的获取

7.1 ServletContext

上下文对象,代表的是当前服务器应用的生命周期,在整个程序运行过程中只会存在一个上下文对象,并且管理者所有的servlet(所有的servlet都能获取上下文对象)

7.1.1 获取上下文对象的方式

(1)通过当前servlet直接获取

		//获取上下文对象
		//在任意servlet方法中通过getServletContext()方法获取
		ServletContext sc1 = this.getServletContext();

(2)通过当前servlet对应的config对象获取

		//通过servletConfig对象进行获取
		//针对于每个servlet都会创建一个servletConfig对象
		//与直接获取没有什么区别
		ServletContext sc2 = this.getServletConfig().getServletContext();

7.1.2 使用

(1)获取当前服务器运行配置的全局参数

getInitParameter(String key)
搭配web.xml中的配置
通过key获取value

web.xml

	<!-- 在全局配置中配置统一的编码 -->
	<context-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</context-param>

servlet

		ServletContext sc1 = this.getServletContext();
		//作用1:通过getInitParameter(name)方法获取对应配置中name对应的value值
		String initParameter = sc1.getInitParameter("encoding");
		System.out.println(initParameter);

(2)获取其它servlet存储的数据

在servlet中,域对象一共有3种.上下文域对象是其中一种
* 域对象是用来做存取值操作的.
* 在域对象中保存的值,只要域对象没有销毁,那么域对象中的值就始终存在
* 作为上下文域对象,取值范围最广泛.
* 当我们将值存放到上下文域对象中之后,上下文对象不销毁,里面存的值也始终存在.服务器关闭,上下文对象销毁,里面的值也随之销毁.域对象的存取值和值的是否销毁,与浏览器是否重启无关
* 域对象的常用方法:
* 存值: 域对象.setAttribute(String key,Object value)
* 取值: 域对象.getAttribute(String key) Object value
* 移除值: 域对象.removeAttribute(String key)

由于上下文对象可以被所有的servlet获取到,所以servlet1存储在上下文对象的数据,servlet2也可以获取到

servlet1

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 Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取上下文对象
        ServletContext sc = this.getServletContext();
        //通过方法进行赋值
        sc.setAttribute("key","s1setValue");
    }
}

servlet2

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 Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取上下文对象
        ServletContext sc = this.getServletContext();
        //通过方法进行获取指定key的value
        Object key = sc.getAttribute("key");
        System.out.println(key);
    }
}

(3)获取当前项目路径

getRealPath("/");

        //获取当前项目的真实路径
        String realPath = sc.getRealPath("/");
        //F:\ai\code\idea0312\out\artifacts\idea0312_war_exploded\
        System.out.println(realPath);

7.2 ServletConfig

每个servlet在创建时都会创建一个对应的config对象,通过这个对象进行初始化配置,可以在init方法中,通过这个对象获取当前servlet在xml中的配置文件

7.2.1 获取

可以直接通过servlet方法获取,在servlet初始化方法中会自动使用对应的配置对象进行初始化

/*
 * ServletConfig对象的取得:
 * 	ServletConfig config = this.getServletConfig();
 *  变量名:config
 */
@Override
public void init(ServletConfig config) throws ServletException {
	
	//创建ServletConfig对象的过程
	super.init(config);
}

7.2.2 使用

(1)获取当前servlet的相应name配置

        //获取当前servlet在web.xml配置的name属性的值
        String servletName = servletConfig.getServletName();
        System.out.println(servletName);

(2)获取在web.xml中为当前servlet配置的初始化属性,通过key获取对应value

web.xml

 	<servlet>
        <servlet-name>s1sadsaadsd</servlet-name>
        <servlet-class>com.yunhe.servlet.Servlet1</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>value</param-value>
        </init-param>
        <init-param>
            <param-name>name1</param-name>
            <param-value>value1</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>s1sadsaadsd</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>

servlet

        //获取配置对象
        ServletConfig servletConfig = this.getServletConfig();
        //获取当前servlet初始化配置的值
        String name = servletConfig.getInitParameter("name");
        String name1 = servletConfig.getInitParameter("name1");
        System.out.println(name+"|"+name1);

八、功能书写

8.1 获取前台客户端传递的参数数据

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前台传递的数据请求携带的数据
        //从请求对象中获取
        //使用getParameter(name)的方式获取请求的指定数据
        String username = req.getParameter("username");
        System.out.println(username);

        //获取多个数据
        String[] likes = req.getParameterValues("like");
        for (String like : likes) {
            System.out.println(like);
        }
        
        //将请求数据返回给客户端
        //使用响应对象方法获取相应的输出流
        PrintWriter writer = resp.getWriter();
        writer.println(username);
        
    }

8.2 解决请求响应数据乱码问题

(1)在上下文对象设置统一的编码格式数据

   <context-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </context-param>

(2)在每个servlet中获取并进行设置

       //在获取数据之前将请求与相关编码进行修改
        String encoding = req.getServletContext().getInitParameter("encoding");
        System.out.println(encoding);
        req.setCharacterEncoding(encoding);
        resp.setCharacterEncoding(encoding);
        resp.setContentType("text/html;charset="+encoding);

8.3 response响应动态页面

使用相应对象的输出流方法在客户端输出动态页面

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //在获取数据之前将请求与相关编码进行修改
        String encoding = req.getServletContext().getInitParameter("encoding");
        req.setCharacterEncoding(encoding);
        resp.setCharacterEncoding(encoding);
        resp.setContentType("text/html;charset="+encoding);



        //获取响应输出流
        PrintWriter writer = resp.getWriter();
        //获取前台传入的账号数据
        String username = req.getParameter("username");
        System.out.println(username);
        
        if("".equals(username)||username.contains(" ")){
            writer.println("<font color='red'>账号不能为null</font>");
        }else {
            writer.println("<font color='green'>"+username+"欢迎登陆!</font>");
        }
        writer.flush();
        writer.close();
    }

九、转发与重定向的区别

 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //请求转发
        //将本次请求转发到其他服务进行处理
        //获取转发对象填入转发位置
        //(1)将当前服务转发到另一个服务执行
        //req.getRequestDispatcher("/test4").forward(req,resp);
        //(2)将当前请求转发到另一个页面
        //跳转至web公开目录下
        //req.getRequestDispatcher("OK.html").forward(req,resp);
        //跳转至web-inf目录下
        //req.getRequestDispatcher("WEB-INF/OK.html").forward(req,resp);

        //重定向
        //告诉客户端本次请求处理结束 你需要继续请求其他服务处理
        //resp.sendRedirect("/test4");
        //跳转至web公开目录下
        //resp.sendRedirect("OK.html");
       
    }

区别

1、语法区别

转发是请求对象调用方法进行转发,重定向是响应对象调用方法进行重定向

2、地址栏变化区别

请求转发请求服务地址不会发生变化,重定向地址栏会变为最终响应的服务地址

3、客户端请求次数的区别

请求转发客户端只请求一次,重定向客户端可能请求多次

4、请求资源的区别

请求转发由于是服务器内部操作所以可以访问WEB-INF下服务器的内部资源,重定向是客户端请求不能直接请求服务器内部资源

5、请求速度的区别

转发是服务器内部操作 所以速度快

6、数据携带的区别

转发可以携带上次请求的数据,重定向不会

7、跳转位置的区别

转发由于携带参数所以只能本服务器之间服务进行转发操作,重定向是客户端重新请求所以可以请求其他服务器服务

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值