简介
Servlet运行过程
- Web浏览器 发出HTTP请求 到Web容器
- Web容器 首次访问创建目标Servlet Servlet
- Web容器 创建请求和响应对象 request, response
- Web容器 调用Servlet方法 Servlet.service(req,resp)
- service(req,resp)获取请求信息,并把响应写入响应信息返回给Web容器
- Web容器 发出HTTP响应 Web浏览器
Servlet实现类
Servlet接口是SUN公司定义了两个默认的实现类;分别是GenericServlet, HTTPServlet;
- HTTPServlet 是只能够处理HTTP请求的servlet,是在原有的Servlet接口上添加了一些与HTTP协议的处理办法,他比Servlet接口的功能更为强大,因此开发人员在编写Servlet时,通常是继承这个类,而避免直接去实现Servlet接口;
- HTTPServlet在实现Servlet接口时,重写了servlet方法,该方法体内的代码会自动的判断用户的请求方式。如为post请求时,则调用dopost方法。如GET方法,则调用HTTPServlet的doGet方法。因此,开发人员在编写Servlet时,通常只需要重写doGet或doPost方法,而不是去重写service方法;
使用IDE开发Servlet
- 准备Servlet需要的jar包;
- 在IDEA中新建一个Web项目;
- 新建一个Servlet;
- 编写代码;
- 配置web.xml中Servlet映射的mapping URL
- 启动Tomcat服务器;
- 访问servlet编写的网页;
一般情况下都会指定一个URL,一个URL对应一个请求;
Response请求
重定向
将这个请求,转换到另一个地址;
例如,当请求:http://localhost:8080/servlet01/dasd/aa.do,就会跳转到百度首页;
ServletContext
通过servletContext对象实现数据共享:是通过this获得ServletContext,实现数据的共享;
通过servletContext对象获取网站的配置文件
1.新建一个properties文件
driver=com.mysql.jdbc.Driver
username=root
password=123456
url=jdbc:mysql://localhost:3306/smbms
2.编写servlet类
package com.zhang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
//读取properties配置文件
public class ServletDemo03 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 {
//读取配置文件
//1.获得配置文件的路径
String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/resources/database.properties");
System.out.println("取得的路径为:"+realPath);
Properties properties = new Properties();
FileInputStream is = new FileInputStream(realPath);
properties.load(is);//把文件流加载到配置文件的对象中;
String driver = properties.getProperty("driver");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
//响应到网页
resp.getWriter().println(driver);
resp.getWriter().println(username);
resp.getWriter().println(password);
resp.getWriter().println(url);
//=======================================
System.out.println(driver);
System.out.println(username);
System.out.println(password);
System.out.println(url);
}
}
3.配置web.xml
<servlet>
<servlet-name>Demo</servlet-name>
<servlet-class>com.zhang.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
4.访问网页查看
localhost:8080/demo/test
Request请求
jsp获取项目的路径
Request对象应用
package com.zhang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//查看request对象的方式
System.out.println(request.getContextPath()); //获得web项目路径
System.out.println(request.getRequestURI()); //请求的URL路径
//Remote 远程
System.out.println(request.getRemoteUser()); //获得远程的用户名
System.out.println(request.getRequestedSessionId()); //获得SessionId;
System.out.println(request.getServletPath()); //请求servlet的url
System.out.println(request.getLocalAddr()); //获得本地地址 防火墙
System.out.println(request.getLocalName()); //获得本地名字
System.out.println(request.getLocalPort()); //获得访问的端口号
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
实例:
Request对象接收前端用户提交的参数
1.编写前端注册页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
</head>
<body>
<%--JSP的注释--%>
<%--Form表单
action:代表要提交的路径,表单要提交到哪里 ,可以提交到一个Servlet
//提交到Servlet需要,获取到Web项目的路径下的Servlet
method: 提交表单的方式
--%>
<h1>注册</h1>
<form action="${pageContext.request.contextPath}/r2" method="post">
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="password" name="password"></p>
<p>
<input type="submit">
<input type="reset">
</p>
</form>
</body>
</html>
2.处理前端提交的Servlet信息
package com.zhang.servlet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//处理前端提交过来的数据
public class RequestDemo02 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 {
//通过HttpServletRequest获取前端用户提交的信息
//req.getParameterValues(); 获得前端传递的控件信息,通过控件的name;但是可以接受多个参数的控件,比如(多选框....)
//req.getParameter(); 获得前端传递的控件信息,通过控件的name;
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
//连接数据库,比较数据库中的信息是否匹配
if (username.equals("admin")&&password.equals("1234567")){
System.out.println("登录成功!"); //跳转到成功页面
}else {
System.out.println("登录失败!"); //提示重新注册
}
System.out.println(username);
System.out.println(password);
}
}
3.配置web.xml对应的文件
<servlet>
<servlet-name>RequsetDemo</servlet-name>
<servlet-class>com.zhang.servlet.RequestDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequsetDemo</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
4.提交测试
转发和重定向的区别(面试题):
重定向:服务器通知客户端,去请求另外一个地址(客户端行为);重定向的地址栏会变而且不能携带参数;
转发:服务器自己转发服务器上的另外一个请求(服务器行为);转发的地址栏不会变,而且可以携带参数;