在之前的学习中,我们主要学习的是JSP的一些使用方法,在这一节中我们将学习关于Servlet的编写。
1、Servlet简单编写
JSP的本质就是Servlet,使用JSP编写我们的Web应用可以帮助我们简化应用表现层的代码,如果我们直接使用Servlet来编写和JSP同样的一个页面,你会发现我们需要使用大量的out语句来给浏览器输出HTML语句。因此MVC规范出现以后,Servlet的责任明确下来,Servlet仅仅作为控制器使用,不需要去生成表现层的代码,这样就让我们的Servlet编写变的更简便了。
例如下面的代码:
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
form id="form1" action="b.jsp" method="post">
用户名:<input type="text" name="username">
密码:<input type="text" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
b.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
String username=request.getParameter("username");
String password=request.getParameter("password");
%>
</form>
</body>
</html>
c.java:
public class Servlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,java.io.IOException
{
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charSet=GBK");
String username=request.getParameter("username");
String password=request.getParameter("password");
out.println("\r\n");
out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.println("<html>\r\n");
out.println("<head>\r\n");
out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n");
out.println("<title>Insert title here</title>\r\n");
out.println("</head>\r\n");
out.println("<body>\r\n");
out.println("用户名"+username);
out.println("密码"+password);
out.println("</body>\r\n");
out.println("</html>");
}
}
在上述的三个文件中,a.jsp中我们定义了一个表单,让用户输入用户名和密码,然后b.jsp可以获取到用户的输入,如果我们想直接编写一个Servlet获取用户的输入并且将他们输出到浏览器中,那我们就可以用c.java的这段代码。
在c.java的代码中,首先我们声明了一个类叫Servlet并且它继承了HttpServlet,在这个类中我们重写service方法,在service方法中我们获取了用户的用户名和密码并且输出到浏览其。通过这段代码我们可以看出,如果我们要用Servlet同时负责表现层的代码,会非常麻烦,每一行代码都要用out输出流输出到浏览器中才能实现,所以我们在编写Servlet时尽量避免编写表现层的代码。
2、Servlet的配置
Servlet主要有两种配置方式:
- 在Servlet类中使用@WebServlet注解进行配置。
- 在web.xml中进行配置。
当我们使用Servlet类的@WebServlet注解进行配置的时候,将会用到以下几条属性:
- asyncSupported:指定该Servlet是否支持异步操作模式。
- displayName:指定该Servlet的显示名。
- initParams:给该Servlet配置参数。
- loadOnStartup:将该Servlet配置为load-on-startup的Servlet。
- name:指定该Servlet的名称。
- urlPatterns/value:都是用来指定该Servlet处理的URL。
当我们使用注解配置Servlet时,要注意不要在web.xml的根元素中指定metadata-complete=”true”,同时不要在web.xml中配置这个Servlet。
如果我们要用web.xml配置,则要配置Servlet的名字和URL,分别对应于元素和元素。要想让我们的Servlet页面能够响应用户的请求,我们必须要配置URL。
例如下面的一段代码就是用来在web.xml中配置一个Servlet的:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instancehttp://www.springmodules.org/schema/cache/springmodules-cache.xsd http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd"
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>WebTest</display-name>
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/ser</url-pattern>
</servlet-mapping>
</web-app>
3、JSP/Servlet的生命周期
在Servlet中主要有三个函数,分别是init、service和destroy函数,当客户端第一次请求一个Servlet的时候,我们就会创建一个Servlet的实例并且使用init方法进行初始化并且使用service方法响应用户,接下来每当客户端请求一次这个Servlet,我们都用调用一次service方法来响应用户,直到调用destroy方法销毁了这个实例,通常我们在关闭Web应用的时候调用destroy方法。以上就是一个Servlet的生命周期,但是还有一种Servlet并不是在用户请求时才创建实例,而是在Web应用启动的时候就创建了实例,这种Servlet我们叫做load-on-startup Servlet。
要想配置一个Servlet成为load-on-startup Servlet,我们可以在web.xml中用以下代码配置:
<servlet>
<load-on-startup>1</load-on-startup>
</servlet>
或者使用@WebServlet注解配置:
@WebServlet(loadOnStartup=1)
4、Servlet配置参数
配置Servlet时还可以增加额外的配置参数。具体使用方法如下:
在@WebServlet注解中配置:
@WebServlet(name="servlet",urlPatterns={"/ser"},
initParams={
@WebInitParam=(name="username",value="dasyang"),
@WebInitParam=(name="password",value="12312")})
}
然后可以使用以下代码获取参数:
String username=config.getInitParameter("username");
String password=config.getInitParameter("password");
或者我们可以在web.xml中配置额外参数:
<servlet>
<init-param>
<param-name>username</param-name>
<param-value>dasyang</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>494894</param-value>
</init-param>
</servlet>