一:servlet简介
jsp的本质就是servlet,servlet可以理解为一个需要配置或者注解,而且必须要继承HttpServlet的java类,这个类的主要作用是可以响应浏览器发出的请求(get、Post). 但是直接用out流输出界面的开发方法效率过低,工作量很大,在MVC流行的今天,servlet一般只用作C使用,即控制器。
一:Servlet的开发
servlet可以响应客户端的四种请求:
>.doGet()
>.doPost();
>.doPut();
>.doDelete();
但是客户端通常只有doGet和doPost请求。而且一般只重写一个doService()请求就会响应客户端的所有请求。
其中还包含两个方法:
init(ServletConfig config);创建servlet实例,初始化参数。
destory();销毁。
这两个方法一般无需重写。除非在初始化servlet的时候需要初始化某些资源才考虑重写这个init()方法,如果在销毁servlet之前要完成某些资源的回收,才考虑重写destory()方法。
二:servlet配置
servlet的源文件并不能响应客户端的请求,必须把他编译成.class文件才行,.class文件一般放在WEB-INF/class的对应的包下面。
为了能响应客户端的请求,必须要对servlet进行配置,在servlet3.0之后,有两种方法对servlet进行配置 1,注解的方式 2,修改web.xml文件。 但是一般都用第二种方法。
配置一个servlet
源码:MyFristServlet.java
public class MyFristServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)
{
try {
request.setCharacterEncoding("GBK");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintStream out = null;
try {
out = new PrintStream(response.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.println("my Frist Servlet");
}
}
在web.xml中增加如下的配置:
<servlet>
<servlet-name>MyFristServlet</servlet-name>
<servlet-class>MyFristServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyFristServlet</servlet-name>
<url-pattern>/MyFristServlet</url-pattern>
</servlet-mapping>
访问http://localhost:8080/Dome/MyFristServlet
三:jsp/servlet的生命周期
1.创建servlet实例(第一次请求或者是web应用启动的时候)
2,web容器调用init()方法对servlet进行初始化。
3,在容器中存在等待程序的调用。
4,销毁
创建-->完成初始化-->响应客户端的请求-->完成资源的回收-->销毁实例。
1,创建:<load-on-startup>标签进行初始化
下面是一个简单的servlet,不响应客户端的请求,只输出时间。
public class showTime extends HttpServlet{
public void init(ServletConfig config) throws ServletException{
super.init(config);
Timer time=new Timer(1000,new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println(new Date());
}
});
time.start();
}
}
在web.xml中增加如下的配置:
<servlet>
<servlet-name>showTime</servlet-name>
<servlet-class>showTime</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>showTime</servlet-name>
<url-pattern>/showTime</url-pattern>
</servlet-mapping>
</web-app>
启动服务器,不需要请求,就会在控制台看见间隔打印出的时间信息。
2,访问servlet的参数配置
servlet获取参数的方法和JSP中获取配置参数的方法几乎一样,可以用ServletConfig对象获取配置参数。
获取servlet源码:
import java.io.IOException;
import java.io.PrintStream;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class getParamServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
//获取servletConfig对象
ServletConfig servletConfig=getServletConfig();
String name=servletConfig.getInitParameter("name");
Enumeration sports=servletConfig.getInitParameterNames();
PrintStream out=new PrintStream(response.getOutputStream());
while(sports.hasMoreElements()){
out.println(servletConfig.getInitParameterNames()+":"+servletConfig.getInitParameter(sports.nextElement().toString()));
}
out.println("name"+name);
}
}
配置文件web.xml中增加配置:
<servlet>
<servlet-name>getParamServlet</servlet-name>
<servlet-class>getParamServlet</servlet-class>
<init-param>
<param-name>age</param-name>
<param-value>30</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>wpz</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>getParamServlet</servlet-name>
<url-pattern>/getParamServlet</url-pattern>
</servlet-mapping>
四:MVC模式下servlet的使用:
上面已经说过,在MVC的模式下,servlet如今的主要作用就是作为控制器使用,下面就举一个标准MVC下servlet使用的例子。
在MVC模式中jsp负责收集用户的信息或者说是请求的参数列表,将请求发送给servlet,servlet在处理后将处理的结果返回给jsp,jsp再呈现给用户,这里 jsp是MVC中的V (view) 、servlet是C(controller),servlet所依赖的实体类为M(Model).
下面就是一个简单的MVC实现登录的例子:
login.jsp:登录界面
LoginServlet.java:登录处理的servlet
DBDao:用于查询和存储用户名、密码
welcome.jsp:成功界面
login.jsp界面源码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'Login.jsp' starting page</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<%
if(request.getAttribute("errMsg")!=null){
out.println(request.getAttribute("errMsg"));
}
%>
<form action="loginServlet" method="post">
用户名:<input type="text" name="username"/><br>
密 码:<input type="text" name=password/><br><hr/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
欢迎界面(登录成功)welcome.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'welcome.jsp' starting page</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
欢迎<%=session.getAttribute("username")%>登录
<body>
This is my JSP page. <br>
</body>
</html>
DBDao.java
package www.clsc.com;
public class DBDao {
String username;
String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
处理的Servlet
package www.clsc.com;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@SuppressWarnings("serial")
public class loginServlet extends HttpServlet {
public void service(HttpServletRequest request,HttpServletResponse response){
String username=request.getParameter("username");
String password=request.getParameter("password");
String errMsg="";
DBDao dbDao=new DBDao();
RequestDispatcher de;
try {
request.setCharacterEncoding("UTF-8");
dbDao.setPassword("222");
dbDao.setUsername("wpz");
//登录状态判断
if(dbDao.getUsername().equals(username)){
System.out.println(password);
if(dbDao.getPassword().equals("222")){
//成功。跳转到成功界面
HttpSession session=request.getSession();
session.setAttribute("username", username);
de=request.getRequestDispatcher("/welcome.jsp");
de.forward(request, response);
}else{
System.out.println("here");
errMsg+="密码不正确";
}
}else{
errMsg+="用户不存在";
}
} catch (Exception e) {
e.printStackTrace();
}
if(null!=errMsg&&""!=errMsg){
//失败
de=request.getRequestDispatcher("/Login.jsp");
request.setAttribute("errMsg",errMsg);
try {
de.forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}