什么是Servlet?
Servlet(Server Applet)是运行在服务器上的程序,主要功能用于生成动态Web内容。
Tomcat与Servlet的关系
Tomcat 是Web应用服务器,是一个Servlet/JSP容器。Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户。而Servlet是一种运行在支持Java语言的服务器上的组件。Tomcat与Servlet是相辅相成的。Tomcat提供运行的基础,Servlet提供软件的实现,共同组建形成软件。
标准Javaweb工程结构
Servlet的执行过程
Servlet开发与基本配置
开发步骤
- 创建Servlet类,继承HttpServlet
- 重写service方法,编写程序代码
- 配置web.xml,绑定URL
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 此时Tomcat还不认识这个servlet,需要在项目的配置文件中配置servlet
* @author LiXinRong
*
*/
public class MyFirstServlet extends HttpServlet {//HttpServlet是所有服务器小程序的父类
@Override//重写service方法,为servlet的请求与响应提供支持。
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收请求的参数,暂时先记住
String name = request.getParameter("name");
String html = "<h1 style='color:red'>hi," + name + "!</h1><hr/>";
System.out.println("返回给浏览器的响应数据为:" + html);
//创建服务器对浏览器的输出流,可以将数据从服务器发送到浏览器
PrintWriter out = response.getWriter();
out.println(html);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>FirstServlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<!-- 创建servlet的别名,就是给真正创建的servlet起了个名字 -->
<servlet-name>first</servlet-name>
<!-- 使用servlet-class指向一个具体的servlet的实现类 -->
<servlet-class>com.dodoke.servlet.MyFirstServlet</servlet-class>
</servlet>
<!-- 构建一个servlet的映射,servlet可以有其具体的地址,这个地址可以被浏览器访问,此处就来设置对应的地址 -->
<servlet-mapping>
<!-- 需要和上方的first同名,这样地址映射才能和具体实现类对应 -->
<servlet-name>first</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
</web-app>
访问方法
请求参数的发送与接收
请求参数
- 请求参数是指浏览器通过请求向Tomcat请求的数据;
- 请求参数通常是用户输入的数据,待servlet进行处理;
- 请求参数的形式:参数名=值1&参数名2=值2&参数名n=值n;
在servlet中,有两个方法去接收参数:
- request.getParameter() 接收单个参数;
- request.getParameterValues() 接收多个同名参数;
GET和POST请求
get是将数据通过url附加数据显性的向服务器发送数据;
post 是将数据放置在请求体中隐性的向服务器发生数据;
在实际工作中,对于get和post请求是需要分开进行处理的,在servlet中提供了doGet和doPost方法。
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 RuquestMethodServlet extends HttpServlet{
//处理get请求
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
response.getWriter().println("<h1 style='color:green'>"+ name +"</h1>");
}
//处理post请求
@Override
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
response.getWriter().println("<h1 style='color:red'>"+ name +"</h1>");
}
}
说明:
- doGet() 常用于不包含敏感词信息查询
- doPost() 用于安全性较高的功能和服务器的写操作
- Service()方法如果不进行重写的话,就相当于一个分发器,是doGet()和doPost()的上级,将不同请求方式的请求交给不同的方法进行处理
Servlet的生命周期
Servlet从创建到死亡经历了哪些过程呢?
- 装载(Tomcat解析XML)此时Tomcat只是解析,并未对其做什么操作
- 创建 第一次访问的时候,创建servlet对象执行构造函数
- 初始化 调用init()方法初始化
- 提供服务 service( )/doGet( )/doPost( )
- 销毁 tomcat关闭或重启的时候执行destory( )
public class MyFirstServlet extends HttpServlet {
public MyFirstServlet() {
System.out.println("正在创建Servlet");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("正在初始化servlet对象");
}
@Override//重写service方法
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servlet正在提供服务");
//接收请求的参数,暂时先记住
String name = request.getParameter("name");
String html = "<h1 style='color:red'>hi," + name + "!</h1><hr/>";
System.out.println("返回给浏览器的响应数据为:" + html);
//创建服务器对浏览器的输出流,可以将数据从服务器发送到浏览器
PrintWriter out = response.getWriter();
out.println(html);
}
@Override
public void destroy() {
System.out.println("正在销毁servlet对象");
}
}
说明:
创建与初始化servlet对象,只在第一次访问servlet时进行,随后的访问不会再去执行,所以在整个系统中,servlet对象有且只有一个。
使用注解简化配置servlet
在Servlet中,有且只有一个核心的注解:@WebServlet,这个注解可以用于简化Servlet在web.xml中的配置工作。
@WebServlet("/sample")
public class SampleServlet extends HttpServlet{
//service()是请求处理的核心方法 无论get和post都会被处理,service方法不区别对待
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String method = request.getMethod();//获取请求的请求方式
String name = request.getParameter("name");
String telphone = request.getParameter("telphone");
String sex = request.getParameter("sex");
String[] specs = request.getParameterValues("spec");
PrintWriter out = response.getWriter();
out.println("<h1>method:"+ method +"</h1>");
out.println("<h1>name:"+ name +"</h1>");
out.println("<h1>mobile:"+ telphone +"</h1>");
out.println("<h1>sex:"+ sex +"</h1>");
for(String str : specs) {
out.println("<h2>spec:"+ str +"</h2>");
}
}
}
启动时加载Servlet
就如同很多程序开机启动一样,servlet可以在Tomcat被启动的使用就进行加载,启动时加载在工作中常用于系统的预处理。我们可以在web.xml中进行设置,配置我们的启动加载服务。
< load-on-startup>设置该节点可以控制启动时加载
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>com.dodoke.servlet.MyFirstServlet</servlet-class>
<!-- 设置启动加载,值越小优先级越高 -->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
也可以使用注解的形式来指定启动时加载
//可以使用属性指定不同的功能
//在@WebServlet注解中,如果只指定了loadOnStartup属性,而没有指定urlPatterns属性,该注解是不起作用的
//因为@WebServlet注解强制要求必须指定urlPatterns属性
@WebServlet(urlPatterns="/first" , loadOnStartup=0)
public class MyFirstServlet extends HttpServlet {}
什么是JSP?
Jsp:Java Server Page(Java服务器页面),是一个动态的网页技术标准。
为什么使用JSP?
虽然我们可以使用Servlet输出动态的网页,但是Servlet本身也有着它的局限性,比如某些复杂的网页开发维护不方便,动态页面和Java代码混合到一起难以维护,Servlet利用out.println()语句输出,开发效率低下,eclipse 难调试等问题。这些问题深深的困扰着我们,于是我们决定放弃使用Servlet对于复杂网页内容的输出,将眼光投向另一门技术Jsp。
JSP与Servlet的关系
Jsp的本质就是Servlet。
JSP的特点
- Jsp是j2ee的功能模块,由web服务器执行
- Jsp作用就是降低动态网页开发难度
- Jsp使用简单,有着HTML和Java基础就可以短时间上手
- Jsp将HTML和Java代码分离,降低开发难度
JSP运行要求
- 可正常运行的Tomcat
- 所有Jsp的页面扩展名必须是.jsp
- Jsp页面应放在web应用程序目录下
JSP的执行过程
关于JSP本质就是Servlet的证明
关于Jsp是Servlet的直接证明我们可以在Tomcat的work文件夹中找到。
所有我们在Jsp中所写的代码,无论是HTML还是Java都会被转译为Servlet代码。
Jsp基本语法-Scriptlet
Jsp的基本语法可以分为以下四种:
- Jsp代码块
- Jsp声明构造块
- Jsp输出指令
- Jsp处理指令
Jsp代码块
用于在JSP中嵌入Java代码,语法:<% java代码 %>
Jsp声明构造块
Jsp声明构造块用于声明变量、方法、类,语法:<%! 声明语句 %>
Jsp输出指令
用于在Jsp页面中显示java代码执行结果,语法:<%= Java代码 %>
Jsp处理指令
用于提供Jsp执行过程中的辅助信息,语法:<%@Jsp指令 %>
常用处理指令:
<%@ page %>定义当前Jsp页面全局设置;
<%@ include %>将其他Jsp页面与当前Jsp页面合并;
<%@ taglib %>引入Jsp标签库;
JSP注释
注意:
HTML注释和Jsp注释不同,Jsp注释不会做任何处理;
而Jsp中的HTML注释仍然会被执行,但之后不会被浏览器解释;
Jsp页面重用
对于页面来说,可能在整个项目中,每个页面都有着相同的头部和相同的尾部内容的。这时可以通过页面复用的方式来提高效率。
include指令可以复用页面
静态包含 include
<%@include file="head.jsp" %>
<h1>content</h1>
<%@include file="foot.jsp" %>
动态包含
<%
String str = "HELLO";
%>
<jsp:include page="head.jsp"></jsp:include>
<h1><%=str %>,CONTENT</h1>
<jsp:include page="foot.jsp"></jsp:include>
静态引入和动态引入的区别
在静态引入中,子页面是原封不动的把页面的信息放到了父页面中,父页面把所有页面的页面信息都收集完成后,统一的进行解析,完成页面的输出。这样,如果在不同的页面中定义了相同名称的变量,那么就会产生冲突。
但是在动态引入中,由于每一个页面都是单独的进行解析的。再交给父页面合成生成一个 HTML 页面,每个子页面和父页面中定义的 Scriptlet 是不会产生冲突的。