JSP本质就是Servlet,开发者把编写好的JSP页面部署在Web容器中,Web容器会将JSP编译成Servlet。但是Servlet开发的效率很低下,特别是使用Servlet生成表现层。自从MVC规范之后,Servlet的责任是仅仅作为控制器使用。
(一)Servlet的开发
JSP的本质就是Servlet,Servlet通常被称为服务器端小程序,是运行在服务器端的程序,用于处理及响应客户端的请求。
Servlet是个特殊的JAVA类,这个java类必须继承HttpServlet。每个Servlet可以响应客户端的请求。Servlet提供不同的方法用于响应客户端请求。
doGet:用于响应客户端的GET请求
doPost:用于响应客户端的POST请求
doPut:用于响应客户端的PUT请求
doDelete:用于响应客户端的Delete请求
事实上,客户端的请求通常只有GET和POST请求两种,Servlet为了响应这两种请求,必须重写doGet方法和doPost方法。如果Servlet为了响应4个方式的请求,则需要同时重写上面4个方法。大部分的时候,Servlet对于所有的请求响应都是完全一样。此时,可以采用重写一个方法来代替上面的几个方法:只需要重写service()方法即可响应客户端的所有请求。
Servlet还包含另外两个方法:
init(ServletConfig config):创建Servlet实例的时候,调用该方法的初始化Servlet资源。
destroy():销毁Servlet实例时,自动调用该方法的回收资源。
通常无需重写init()和destroy()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init方法。如果需要在销毁Servlet之前,先完成某些资源的回收,比如关闭数据库连接,才需要重写destroy方法。
package servlet;
import java.io.PrintStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstServlet extends HttpServlet{
//重写客户端的响应方法,使用该方法可以响应客户端所有类型的请求
public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,java.io.IOException{
//设置解码方式
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charSet=UTF-8");
//获取name的请求参数
String name=request.getParameter("name");
//获取gendar的请求参数
String gender=request.getParameter("gender");
//获取color的请求参数
String[] color=request.getParameterValues("color");
//获取country的请求参数
String national=request.getParameter("country");
//获取页面输出流
PrintStream out=new PrintStream(response.getOutputStream());
//输出HTML页面标签
out.println("<html>");
out.println("<head>");
out.println("<title>servlet测试</title>");
out.println("</head>");
out.println("<body>");
//输出请求参数的值:name
out.println("您的名字是"+name+"<hr>");
//输出请求参数的值:gender
out.println("您的性别是:"+gender+"<hr>");
//输出您喜欢的颜色值:color
for(String co:color){
out.println(co+" ");
}
//输出请求参数的值:national
out.println("您来自的国家是:"+national+"<hr>");
out.println("</body>");
out.println("</html>");
}
}
Servlet 和JSP的区别在于:
1.Servlet中没有内置对象,原来JSP中的内置对象都必须由程序显示创建。
2.对于静态的HTML标签,Servlet都必须使用页面输出流逐行输出。
普通的Servlet类里面的service方法的作用,完全等同于JSP生成Servlet类的_JSPService方法。因此原JSP页面的JSP脚本,静态的HTML内容,在普通的Servlet里面都将转换成service方法的代码或输出语句;原jsp声明中的内容,对应为在Servlet中定义的成员变量或成员方法。
(二)Servlet的配置
编辑好的Servlet源文件并不能响应用户请求,还必须将其编译成class文件。将编译后的class文件放在WEB-INF/classes路径下,如果servlet有包,则还应将class文件放在对应的包路径下。
为了让servlet能响应用户请求,还必须将Servlet配置在web应用中。配置Servlet时,需要修改web.xml文件。
从Servlet3.0开始,配置Servlet有两种方式:
1.在Servlet类中使用@WebServlet Annotation进行配置。
2.通过在web.xml文件中进行配置。(@WebServlet=(name="firstServlet",urlpatterns={"/firstServlet"});)
@WebServlet annotation 支持的属性如下:
- name – Name of the servlet – optional
- asyncSupported=true/false – Specifies weather the servlet supports asynchronous processing or not.
- largeIcon – large icon for this Servlet, if present – optional
- smallIcon – small icon for this Servlet, if present – optional
- description – Servlet description – optional
- initParams – Array of @WebInitParam, used to pass servlet config parameters – optional
- loadOnStartup – Integer value – optional
- displayName -Servlet display name – optional
- urlPatterns – Array of url patterns for which the sevlet should be invoked – Atlease one url pattern is requried
如果在web.xml中配置servlet,则需要配置两个部分
1.配置servlet的名字:对应web.xml文件中<servlet/>元素
2.配置Servlet的URL:对应web.xml文件中<Servlet-mapping/>元素。这一步是可选的。但是如果没有为Servlet配置URL,则该Servlet不能响应用户请求。
<!-- 配置servlet的名字-->
<servlet>
<!-- 指定servlet的名字,相当于指定@WebServlet的name属性-->
<servlet-name>firstServlet</servlet-name>
<!-- 指定servlet的实现类 -->
<servlet-class>servlet/FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 指定servlet的名字-->
<servlet-name>firstServlet</servlet-name>
<!-- 指定servlet映射的URL地址,相当于指定@WebServlet的urlPattern属性-->
<url-pattern>/aa</url-pattern> //提交到servlet的action名字一致
</servlet-mapping>