day02
Servlet入门
1.1Serlvet介绍
API.png文档总结:
什么是servlet?
处理请求和响应的java程序。
怎么创建servlet?
继承HttpServlet类,在web.xml中配置
1.2Servlet开发的步骤:(重点)
1、在cn.igeek.web包下 创建一个类 实现 HttpServlet 类
2、重写doGet和doPost方法
package cn.igeek.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class DemoServlet
*/
@WebServlet("/DemoServlet")
public class DemoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DemoServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet....");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost....");
doGet(request, response);
}
}
3、在当前项目中的web.xml文件中配置当前开发好的Servlet程序
<servlet>
<!-- servlet的名称 -->
<servlet-name>DemoServlet</servlet-name>
<!-- servlet的具体实现类 -->
<servlet-class>cn.igeek.web.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- servlet的名称 -->
<servlet-name>DemoServlet</servlet-name>
<!-- 访问这个servlet程序的请求路径 -->
<url-pattern>/DemoServlet</url-pattern>
</servlet-mapping>
4、发布这个项目,运行服务器,测试
doGet....
1.31.6获取请求(重点)
准备HTML
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/day02/my" method="post">
用户名:<input type="text" name="username"><br>
爱 好:<input type="checkbox" name="hobby" value="football">足球
<input type="checkbox" name="hobby" value="basketball">篮球<br>
<input type="submit" value="提交">
</form>
</body>
</html>
发送请求,之后要接收,对于提交上了的用户名,爱好,我们必须获取后,才能处理,那么请求参数如何获取?
使用服务器给我提供的一个对象Request对象!!!!!
request.png
获取参数的方法有哪些?
String getParameter(String name)
根据name获取对应的值
Map getParameterMap()
参数名作为key,参数值作业value,封装到map中
String[] getParameterValues(String name)
获取name相同的所有value 例如复选框
//需求:获取注册页面的值。
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("getParameter:"+request.getParameter("username"));
System.out.println("===============");
String[] values = request.getParameterValues("hobby");
for (String string : values) {
System.out.println("getParameterValues:"+string);
}
System.out.println("===============");
Map<String, String[]> map = request.getParameterMap();
for(String key : map.keySet()){
for (String value : map.get(key)) {
System.out.println("getParameterMap:"+value);
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
1.4发送响应(重点)
response.png这个对象用于向浏览器发出响应,要使用的方法为:
PrintWriter.pngjava.io.PrintWriter getWriter()
返回可将字符文本发送到客户端的PrintWriter 对象
要使用的方法:
void write (String s)
写入字符串
代码:
System.out.println("========发出响应===========");
response.getWriter().write("test OK!!!!");
第2章Servlet开发应用——登录案例(重点)
2.1需求分析
图片1.png2.2准备工作
<form action="../login" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登录"/></td>
</tr>
</table>
</form>
Debug调试模式界面介绍:
开启debug模式操作:1 服务器启动必须dubug模式 2 需要查看的位置双击设置断点
2.2.1最终结构
图片2.png2.3登录servlet
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数(username password)
String username = request.getParameter("username");
String password = request.getParameter("password");
//开启debug模式操作:1 服务器启动必须dubug模式 2 需要查看的位置双击设置断点
//封装数据到user对象
User user = new User();
user.setUsername(username);
user.setPassword(password);
//调用service方法,执行用户登陆
UserService userService = new UserService();
User loginUser = userService.login(user);
//根据返回的结果,给出不同提示信息
if(loginUser == null){
//用户名或者密码错误,login error
response.getWriter().write("login error");
}else{
//登陆成功,login OK
response.getWriter().write("login OK");
}
}
2.4 业务层
public class UserService {
private UserDao userDao = new UserDao();
/**
* 用户登陆的方法
* @param user
* @return
*/
public User login(User user) {
return userDao.login(user);
}
}
2.5数据层
public class UserDao {
private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
public User login(User user) {
String sql = "select * from user where username = ? and password = ?";
try {
return qr.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword());
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("用户登陆失败");
}
}
}
第3章servlet其他
3.1Servlet的生命周期(了解)
生命周期:是说一个对象从创建到销毁的整个过程。称为整个对象的一个生命周期。
图片3.png
上图描述了servlet的生命周期。按照功能的不同,大致分为三个阶段,分别是 初始化阶段,运行阶段(最频繁) 和 销毁阶段。
注意:当服务器关闭的时候,项目中的servlet就调用第8步销毁。
总结:Servlet 的创建,在用户第一次请求,之后,创建。销毁,是发生在服务器关闭的时候。
3.1.1初始化阶段
当客户端向tomcat发送http请求访问servelt程序,tomcat首先会解析请求,检查内存中是否已经有了该servlet对象:
如果有直接使用对应的servlet对象;
如果没有就创建servlet实例对象,然后通过调用init() 方法实现Servlet的初始化工作。
需要注意的是,在整个servlet的生命周期内,init方法只被调用了一次。
测试:添加了init方法
public class DemoServlet extends HttpServlet{
@Override
public void init() throws ServletException {
System.out.println("DemoServlet....init....");
super.init();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("DemoServlet.....doGet....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("DemoServlet.....doPost....");
}
}
3.1.2运行阶段
在这个阶段,tomcat服务器会为这个请求 创建 代表HTTP请求的ServletRequest对象 和 代表HTTP响应的 ServletResponse对象,然后将他们作为参数传递给service() 方法。
servcie() 方法从ServletRequest对象获取请求的信息并做出处理;通过ServletResponse 对象生成响应的结果。
在servlet的整个生命周期内,对于servlet的每一次访问请求,tomcat都会调用servlet的service方法,并且创建新的ServletRequest对象和ServletResponse对象。也就是说service() 方法会servlet的生命周期内会被调用多次。
doGet和doPost由service方法调用:在我们写的servlet父类HttpServlet中源码:
图片4.png
源码展示:////////////////标记重点////////////////////
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String method = req.getMethod();
/////////////////////////////////////////////
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
//////////////////////////////////////////////////////
} else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
///////////////////////////////////////////
doPost(req, resp);
///////////////////////////////////////////
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
3.1.3销毁阶段
当服务器关闭时,servlet会随着Web应用的销毁而销毁。
在销毁serlvet之前,tomcat 会调用Servlet的destory方法,以便让Servlet对象释放他所占用的资源。
第4章ServletConfig介绍
应用场景:
为了将一些灵活需要修改的内容,设置到web.xml中,后期 ,可以在不修改代码的情况下,通过修改配置文件,达到,修改内容的目的
图片5.png
图片6.png
图片7.png
图片8.pngservlet容器: tomcat(java的web服务器)
sun公司要求服务器,创建servlet的同时,再去创建一个servletConfig对象. ServletConfig包含了一些Servlet的配置信息.
再调用servlet的init方法时,将servletCongfig传给servlet
servletConfig的内容是 是自己定义的. 在web.xml中 的servlet标签下书写servletConfig的内容.
ServletConfig它读取某个Servlet的配置信息。
1、如果servlet需要一些参数. 我们可以在web.xml的servlet标签内进行配置
2 tomcat去工作: 读取servlet中init-param这个标签. 把里面的内容封装到ServletConfig中
3 tomcat去工作: 调用servlet的init方法, 把封装好的 servletConfig对象, 传递给servlet中.
调用servelt中的init(ServletConfig config)
private transient ServletConfig config;
public void init(ServletConfig config) throws ServletException{
this.config=config;
this.init();
}
4 如何使用
获取servletConfig对象, 通过servlet的getServletConfig() 方法
//获取servletconfig对象
ServletConfig cfg =this.getServeltConfig();
获取内部的参数值:通过servletConfig.getInitParameter(key)
//从对象中根据key 获取value
String company =cfg.getInitParameter("company")
5、重启tomcat,地址栏访问 对应的servlet