带你认识jsp中的Servlet基础


什么是Servlet


Servlet是使用Java语言编写的运行在服务器端的程序,它在JSP 诞生之前就存在。

Servlet是使用Java Servlet应用程序设计接口(API)及相关类和方法的Java程序。Java语言能够实现的功能,Servlet基本上都能实现(除了图形界面外)。

Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应,它能够处理的请求有doGet()和doPost()等方法。

在这里插入图片描述


Servlet接口及其实现类


针对Servlet技术的开发,SUN公司提供了一系列接口和类,其中最重要的接口是javax.servlet.Servlet。在Servlet接口中定义了5个抽象方法:

在这里插入图片描述

针对Servlet的接口,SUN公司提供了两个默认的接口实现类:GenericServlet和HttpServlet。

GenericServlet是一个抽象类,该类为Servlet接口提供了部分实现,它并没有实现HTTP请求处理。

HttpServlet是GenericServlet的子类,它继承了GenericServlet的所有方法,并且为HTTP请求中的POST、GET等类型提供了具体的操作方法。

通常情况下,编写的Servlet类都继承自HttpServlet,在开发中使用的具体的Servlet对象就是HttpServlet对象。HttpServlet的常用方法及其说明:

在这里插入图片描述

通过修改doGet()方法在网页中输出Hello world!

HelloServlet.java:

package cn.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/HelloServlet")  //url地址,“/”表示项目的根目录       Servlet需要重启服务器(修改xml文件的时候才重启)
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<body>");
		out.println("<h1>Hello world!</h1>");
		out.println("</body>");
		out.println("</html>");
		out.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在这里插入图片描述

接收表单内容并输出
form.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<!-- <form action="/Servlet/FormServlet" method="post"> -->     <!-- 绝对路径 -->
	<form action="../FormServlet" method="post">					<!-- 相对路径 -->
		姓名:<input type="text" name="name"/> <br>
		爱好:<input type="text" name="hobby"/> <br>
		<input type="submit" value="提交"/>
	</form>

</body>
</html>

FormServlet.java:

package cn.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * Servlet implementation class FormServlet
 */
@WebServlet("/FormServlet")
public class FormServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FormServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		String name = request.getParameter("name");
		String hobby = request.getParameter("hobby");
		PrintWriter out = response.getWriter();
		out.print("姓名:"+name+"</br>"+"爱好:"+hobby);
		out.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

注意上面form表单中action中的地址路径,而且要注意doGet方法中内容的修改

在这里插入图片描述
在这里插入图片描述


Servlet 的生命周期


按照功能的不同,大致可以将Servlet的生命周期分为三个阶段,分别是初始化阶段、运行阶段和销毁阶段。

在Servlet的整个生命周期内
init()方法只被调用一次
Service()方法会被调用多次
Destroy()方法也只被调用一次。

在这里插入图片描述

代码进行表达:
MyServlet.java

package cn.servlet;

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

/**
 * Servlet implementation class MyServlet
 */
@WebServlet("/MyServlet")   //有注解,修改了xml配置文件,需要重启服务器
public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("init method is called!");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destory method is called!");
	}

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("service method is called!");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		System.out.println("doGet method is called!");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在这里插入图片描述

如果将下面的代码删除的话:

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("service method is called!");
	}

在这里插入图片描述


多学一招: 自动加载Servlet程序


在实际开发时,有时候会希望某些Servlet程序可以在Tomcat启动时随即启动。例如,当启动一个Web项目时,首先需要对数据库信息进行初始化。这时,只需要使用web.xml文件中<load-on-startup>元素,将初始化数据库的Servlet配置为随着web应用启动而启动的Servlet即可。

在<load-on-startup>元素中,设置的值必须是一个整数。如果这个值是一个负数,或者没有设定这个元素,Servlet容器将在客户端首次请求这个Servlet时加载它;如果这个值是正整数或0,Servlet容器将在Web应用启动时加载并初始化Servlet,并且<load-on-startup>的值越小,它对应的Servlet就越先被加载。
 <servlet>
  <servlet-name>HelloWorldServlet</servlet-name>
  <servlet-class>cn.demo.servletdemo.HelloWorldServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
  </servlet>

取得其他内置对象


ServletConfig
Config对象即ServletConfig接口的实例,通过它可以读取web.xml中配置的初始化参数。

ServletContext
application对象是ServletContext接口的实例,表示Servlet上下文。

取得session对象

HttpRequest对象有两种形式的getSession方法调用:
(1)request.getSession()
检测当前有session存在,如果不存在则创建一个,如果存在就返回当前的
(2)request.getSession(boolean isNew)   
参数为true时,若存在会话则返回该会话,否则新建一个会话。 
参数为false时,若存在会话则返回该会话,否则应该返回一个NULL       
getSession()相当于getSession(true)

输出真实路径

TextServlet.java:

package cn.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TextServlet
 */
@WebServlet("/TextServlet")
public class TextServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TextServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		ServletContext app = this.getServletContext();
		PrintWriter out = response.getWriter();
		out.print("真实路径="+app.getRealPath("/"));
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在这里插入图片描述

取得session对象,获得内容
SessionServlet.java

package cn.servlet;

import java.io.IOException;
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 javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SessionServlet
 */
@WebServlet("/SessionServlet")
public class SessionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SessionServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		System.out.println("session id ------------>"+session.getId());
		session.setAttribute("username", "刘德华");
		System.out.println("username属性de内容是:"+session.getAttribute("username"));
	}
	

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在这里插入图片描述


Servlet跳转


客户端跳转

response.sendRedirect(“url”)

服务器端跳转

request.getRequestDispatcher(“url”).forward(requset,reponse);

JSP开发模型


JSP Model2架构模型采用JSP+Servlet+ JavaBean的技术,此技术将原本JSP页面中的流程控制代码提取出来,封装到Servlet中,从而实现了整个程序页面显示、流程控制和业务逻辑的分离。JSP Model2的工作原理如下图所示。

在这里插入图片描述


MVC设计模式


MVC设计模式将软件程序分为三个核心模块:模型(Model)、视图(View)和控制器(Controller) ,这三个模块的作用如下所示。

在这里插入图片描述

使用mvc模式获取表单信息,并实现跳转登陆页面功能

a1_form_zhuce_.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="RegisterServlet" method="post">
	
	<h3>用户注册表单</h3>
	<p>姓名:<input type="text" size="20" name="uname"></p>
	<p>密码:<input type="password" name="pwd"></p>
	<p>
		性别:<input type="radio" name="sex" value="男" checked="checked"><input type="radio" name="sex" value="女">
	</p>
	<p>
		爱好:
			篮球<input type="checkbox" name="duo" value="篮球">
			足球<input type="checkbox" name="duo" value="足球">
			手球<input type="checkbox" name="duo" value="手球">
			爬山<input type="checkbox" name="duo" value="爬山">
			游泳<input type="checkbox" name="duo" value="游泳">
	</p>
	<p>E-maile<input type="email" name="email"></p>
	<p>
		<input type="submit" value="提交">
		<input type="reset" value="重置">
		<input type="button" value="普通">
	</p>
	
</form>

</body>
</html>

RegisterServlet.java

package cn.mvc.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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 cn.dao.dao.UserDaoImplete;
import cn.dao.vo.User;

/**
 * Servlet implementation class RegisterServlet
 */
@WebServlet("/mvc/RegisterServlet")
public class RegisterServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RegisterServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1、获取表单输入的数据
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		String name = request.getParameter("uname");
		String pwd = request.getParameter("pwd");
		String gender = request.getParameter("sex");
		String message = "" ;
		String []favour = request.getParameterValues("duo");
		for(int i = 0 ; i < favour.length ; i++){
	 		message = message + favour[i]+",";
	 	}
		String email = request.getParameter("email");
		//2、封装到User里面
		User user = new User(0,name,pwd,gender,message,email);
		UserDaoImplete udi = new UserDaoImplete();
		boolean flag = udi.add(user);
		//PrintWriter out = response.getWriter();
		if(flag){
//			客户端跳转
//			response.sendRedirect("a1_denglu.jsp");
//			out.print("<h1>注册成功!2秒后自动跳转到登陆页面,如果没有跳转,请点击<a href='a1_denglu.jsp'>登陆</a></h1>");
			//服务器端跳转
			request.getRequestDispatcher("a1_denglu.jsp").forward(request, response);
		}else {
			response.sendRedirect("a1_form_zhuce_.jsp");
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值