一、servlet简介
Servlet(Server Applet),全称Java Servlet,是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。
servlet本质上是一个特殊java类,需要遵循servlet规范,比如servlet没有main方法,servlet和http协议联系紧密。
二、在eclipse中创建servlet
新建一个dynamic web project,src目录下新建包,然后新建一个HelloworldServlet.java类.
2.1继承HttpServlet类:
package ucas.ac.cn.servlet;
import javax.servlet.http.HttpServlet;
public class HelloworldServlet extends HttpServlet{
}
2.2添加doGet和doPost方法
在eclipse中,单击鼠标右键->source->Override/Implement methods,然后选择doGet和doPost方法.
2.3登录示例
做一个用户登录的例子,用户在客户端提交用户名和密码后,HelloworldServlet去处理用户参数,根据处理结果转发到不同的页面.
2.3.1新建login.jsp
首先在webContent/12目录下添加login.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<form action="" method="post">
用户名:<input type="text" name="userName"><br> 密码:<input
type="password" name="passWord"><br> <input
type="submit" value="登录"><br>
</form>
</body>
</html>
现在action地址为空,当点击登录按钮后我们希望一个servlet去处理用户提交的用户名和密码,下面在配置servlet路径。
2.3.2配置web.xml
<servlet>
<servlet-name>HelloworldServlet</servlet-name>
<servlet-class>ucas.ac.cn.servlet.HelloworldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloworldServlet</servlet-name>
<url-pattern>/Helloworld</url-pattern>
</servlet-mapping>
<servlet></servlet>
中有两个属性,第一个是servlet-name,这个名字可以自定义,第二个是servlet-class,表示serlet-name所对应的java类的位置;<servlet-mapping></servlet-mapping>
中也有2个属性,第一个servlet-name即为<servlet></servlet>
中所定义的servlet的名字,第二个url-pattern为在浏览器中的访问名称,在这个实例中访问http://localhost:8080/工程名/Helloworld就会转到ucas.ac.cn.servlet包目录下的HelloworldServlet类。
修改logn.jsp:
<form action="<%=request.getContextPath() %>/Helloworld" method="post">
2.3.3编写doGet和doPost方法
在HelloworldServlet.java中编写处理用户名和方法的doGet和doPost方法:
package ucas.ac.cn.servlet;
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;
public class HelloworldServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("userName");
String password = req.getParameter("passWord");
if (username.equals("admin") && password.equals("123456")) {
req.getRequestDispatcher("/12/success.jsp").forward(req, resp);
} else {
req.getRequestDispatcher("/12/fail.jsp").forward(req, resp);
}
}
}
在doPost方法中,使用request对象接收用户名和密码,假定用户名为admin密码为123456时登录成功,转发到success.jsp;否则登录失败,转发到fail.jsp.
三、请求转发和请求重定向
在上面的登录实例中,servlet接收到用户输入的用户名和密码以后使用request的重定向方法转发到success.jsp和fail.jsp:
req.getRequestDispatcher("/12/success.jsp").forward(req, resp);
如果用户名和密码输入正确,登录成功,要跳转到另外一个网站,比如转到百度首页,把"/12/success.jsp"
改成"https://www.baidu.com/"
,那么会出现404错误。使用请求重定向可以实现:
resp.sendRedirect("https://www.baidu.com/");
原因在于请求转发只能访问同一个项目下的资源,浏览器内到地址不会发生变化,整个过程处于同一个请求当中。
请求转发的过程:
- 客户端发送请求,servlet1接收请求做出处理。
- sevlet1调用sendReadirect()方法,转发给sevlet2或jsp。
- sevlet2处理客户端请求。
请求重定向的过程:
- 客户端发送请求,servlet1接收请求做出处理。
- sevlet1调用sendReadirect()方法,转发给sevlet2或jsp
- 客户端浏览器访问Servlet2
sevlet2处理客户端请求。
可以看出,请求重定向可以访问外部资源,地址栏发生变化。
详细参考:
Jsp 重定向、请求转发