这里以Eclipse为例,IDEA配置参考:IDEA 配置 Tomcat
一、Eclipse配置Tomcat
1.配置服务器运行环境
在窗口-首选项找到服务器-运行时环境,点击添加
在Apache中找到安装的Tomcat版本,下一步
选择安装目录以及所需的jdk版本,添加完成后应用并关闭
2.新建服务器
窗口-显示视图,找到服务器,打开
点击服务器视图中的连接
新建服务器,选择Tomcat的对应版本
3.新建动态Web项目
右键左侧空白处新建动态Web项目
输入项目名,下一步
勾选生成web.xml部署描述符,完成
4.创建类继承HttpServlet
创建一个类用于演示,项目结构如下
编写代码:
@WebServlet(urlPatterns = "/easy")
public class EasyServlet extends HttpServlet{//Servlet java服务端应用程序//EasyServlet extends HttpServlet//EasyServlet也是一个java服务端应用程序//就可以接收浏览器发送过来的请求//浏览器发送请求一般有两种形式 get/post//HttpServlet中定义了doGet和doPost两个方法//分别来处理get请求和post请求@Overridepublic void doGet(HttpServletRequest request,HttpServletResponse response) throwsIOException {System.out.println("----接收到请求");//接收参数String params_name= request.getParameter("name");response.getWriter().write("params---"+params_name);}@Overridepublic void doPost(HttpServletRequest request,HttpServletResponse response) {}}
5.启动服务器
右键服务器-添加和移除
点击添加
再次右键服务器,启动
控制台会打印日志
6.测试访问
浏览器中可以访问到
二、请求转发与重定向
请求转发是指服务器接收到客户端的请求之后,将该请求转发给另一个资源进行处理,并将处理结果返回给客户端。客户端并不知道服务器进行了请求转发,它只知道最终返回的结果。这种方式下,客户端只发送了一次请求,服务器进行了多次处理。
重定向是指服务器接收到客户端的请求之后,返回一个特殊的响应码,告诉客户端需要重新发送请求到另一个URL。客户端会根据这个响应码进行解析,并重新发送请求到指定的URL。这种方式下,客户端发送了两次请求,第一次请求到达服务器后,服务器会返回特殊的响应码,然后客户端再根据这个响应码发送第二次请求。
1、请求转发
只能在项目中转发
编写一个类测试请求转发
@WebServlet("/hello")
public class HelloServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {System.out.println("HelloServlet接收到请求");resp.getWriter().write("HelloServlet response");}
}
修改EasyServlet中的方法
@Overridepublic void doGet(HttpServletRequest request,HttpServletResponse response) throws
IOException, ServletException {System.out.println("----接收到请求");//接收参数String params_name= request.getParameter("name");//转发if(params_name!=null) {//回应response.getWriter().write("params---"+params_name);return;}else {//转发request.getRequestDispatcher("/hello").forward(request,response);return;}}
测试请求转发
2、重定向
//重定向if("re".equals(params_name)) {response.sendRedirect("https://www.baidu.com");return;}
三、Servlet的作用域
Servlet的作用域是指Servlet对象在内存中存在的范围或时间段。Servlet共有4个作用域:请求(Request)、会话(Session)、上下文(Context)和页面(Page)。
请求作用域(Request): 请求作用域表示Servlet对象在一次HTTP请求的处理过程中存在,并且仅对当前请求有效。在同一次请求中,不同的Servlet对象之间无法共享数据。可以使用request对象的setAttribute()和getAttribute()方法来实现在不同的Servlet之间传递数据。
会话作用域(Session): 会话作用域表示Servlet对象在整个用户会话过程中存在,即从用户发送第一个请求到用户关闭浏览器。会话作用域中的Servlet对象可以跨多个请求共享数据。可以使用session对象的setAttribute()和getAttribute()方法来实现在不同的请求之间传递数据。
上下文作用域(Context): 上下文作用域表示Servlet对象在整个Web应用程序的生命周期中存在。在同一个Web应用程序中的不同Servlet对象可以共享数据。可以使用servletContext对象的setAttribute()和getAttribute()方法来实现在不同的Servlet之间传递数据。
页面作用域(Page): 页面作用域表示Servlet对象在页面级别上存在,即一个页面对应一个Servlet实例。在同一个页面中的不同Servlet对象可以共享数据。可以使用pageContext对象的setAttribute()和getAttribute()方法来实现在不同的Servlet之间传递数据。
作用域对象 request,session,ServletContext
转发前设置一个键值对
//作用域对象 request session ServletContextrequest.setAttribute("白龙马","小白龙");//转发request.getRequestDispatcher("/hello").forward(request,response);return;
接收请求
@WebServlet("/hello")
public class HelloServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {System.out.println("HelloServlet接收到请求");Object obj = req.getAttribute("白龙马");resp.setHeader("Content-Type", "text/html;charset=utf-8");resp.getWriter().write("HelloServlet response:"+obj);}
}
四、.jsp静态文件
在webapps文件夹新建一个jsp文件
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>easypage页面<br/>${loginuser}
</body>
</html>
创建类
@WebServlet("/page")
public class PageServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {//处理业务获取数据...req.setAttribute("loginuser", "张三");req.getRequestDispatcher("/easypage.jsp").forward(req, resp);return;}
}
测试访问
五、 Servlet生命周期
Servlet的生命周期指的是Servlet在服务器中从被创建到被销毁的整个过程。Servlet生命周期可以分为三个阶段:初始化、服务和销毁。
Servlet在第一次访问时实例化对象,实例化之后理解执行了初始化方法,是单例的,线程不安全。
//Servlet生命周期
//loadOnStartup默认-1,设置为正数则在启动时直接实例化对象,数值越小越优先
@WebServlet(urlPatterns = "/page",loadOnStartup = 1)
public class PageServlet extends HttpServlet{public PageServlet() {System.out.println("PageServlet------实例化对象");}@Overridepublic void init() throws ServletException {System.out.println("PageServlet------初始化对象");}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {//服务super.service(req, resp);//先执行service方法根据请求方式不同分别执行doGet或doPost方法}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {//处理业务获取数据...req.setAttribute("loginuser", "张三");req.getRequestDispatcher("/easypage.jsp").forward(req, resp);return;}@Overridepublic void destroy() {//要结束时执行销毁System.out.println("PageServlet------销毁对象");}}
第一次访问时
服务器停止时