- 1.Servlet基础
- 1.1 Servlet结构体系
- 1.2 Sevlet技术特点
- 1.3 Servlet与JSP的区别
- 1.4 第一个Servlet例子
- 1.5 Servlet生命周期
- 2.Servlet API编程常用接口和类
- 2.1 Servlet接口
- 2.2 ServletConfig接口
- 2.3 HttpServletRequest接口
- 2.4 HttpServletResponse接口
- 2.5 GenericServlet类
- 2.6 HttpServlet类
- 3.Servlet获取表单数据
- 4.Servlet之间的跳转
- 5.获取初始化参数
- 6.servlet九大内置对象
1.1 Servlet结构体系servlet是运行在Web服务器端的Java应用程序,与Java此程序的区别就是,Serlvet对象主要封装了HTTP请求的处理,并且它的运行需要Servle容器的支持。
1.2 Sevlet技术特点Servlet是一个标准
Servlet和ServletConfig定义了Servlet的基本方法和相关配置信息
- 功能强大
- 可移植
- 性能高效
- 安全性高
- 可扩展
- 角色不同
- 编程方法不同
- Servlet需要编译后运行
- 速度不同
创建Servlet
package com.lxg.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Serlvet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
在web.xml中配置servlet
1.5 Servlet生命周期servlet3 com.lxg.servlet.Servlet3 5 servlet3 /servlet3
- 初始化阶段,可以是在服务器启动初始化,也可以在第一次调用初始化,生成实例。
- 调用init();
- 调用servicr();判断是哪一种请求,get请求会调用doGet(),post请求调用doPost();
- 在服务器停止的时候,调用destroy();
package com.lxg.servlet;
import javax.servlet.*;
import java.io.IOException;
public class Servlet2 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service...");
}
public String getServletInfo() {
return null;
}
public void destroy() {
System.out.println("destroy...");
}
}
几个知识点:
- Servlet 启动时自动装载servlet,需要在 web.xml配置,在之间添加如下代码:< loadon-starup >1< /loadon-starup>,数字越小,优先级越高。如果不配置,则第一次访问servlet时装载。
- servlet被加载的时候,会调用init()方法,在整个生命周期中init() 只会调用一次,装载后,实例贮存在服务器的内存中。
package com.lxg.servlet;
import javax.servlet.*;
import java.io.IOException;
public class Servlet1 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet service running...");
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
2.2 ServletConfig接口
封装Servlet的配置信息,在Serlvet初始化期间被传递,每一个Servlet都有且是有一个ServletConfig对象。
ServletConfig servletConfig = getServletConfig();
servletConfig.getInitParameter("init");//获取初始化参数值
servletConfig.getInitParameterNames();//获取所有初始化参数名称
servletConfig.getServletContext();//获取Servlet上下文对象
servletConfig.getServletName();//获取Servlet对象的实例名
2.3 HttpServletRequest接口
继承了javax.servlet.ServletRequest接口。
req.getContextPath(); //获取请求的上下文路径,以"/"开头
req.getcookies();//获取请求中发送的所有cookie对象,返回cookie的数组
req.getMethod();//获取请求的方式
req.getQueryString();//获取请求参数中的字符串形式
req.getRequestURI();//获取URI
req.getServletPath();//获取URI中的Servlet路径
req.getSession();//获取与请求关联的HttpSession对象
package com.lxg.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/request1")
public class Request1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//演示request对象的方法
//获取请求消息数据
//1.获取请求行数据
String method = req.getMethod();//获取请求行
String contextPath = req.getContextPath();//获取虚拟路径
String servletPath = req.getServletPath();//获取servlet路径
String queryString = req.getQueryString();//获取get方式请求参数
String requestURI = req.getRequestURI();//获取请求的URI
StringBuffer requestURL = req.getRequestURL();//获取URL
String protocol = req.getProtocol();//获取协议
System.out.println(method);
System.out.println(contextPath);
System.out.println(servletPath);
System.out.println(queryString);
System.out.println(requestURI);
System.out.println(requestURL);
System.out.println(protocol);
System.out.println("-------------------------------");
//2.获取请求头数据
Enumeration headerNames = req.getHeaderNames();//获取所有请求头的名称
while(headerNames.hasMoreElements()){
String header = req.getHeader(headerNames.nextElement());
System.out.println(header);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
2.4 HttpServletResponse接口
继承了javax.servlet.ServletResponse接口
//向客户端写入cookie
resp.addcookie(new cookie("hh","test"));
//发送一个错误代码响应到客户端
resp.sendError(404);
//发送错误代码到客户端,以及错误信息
resp.sendError(404,"msg");
//重定向到location指向的资源
resp.sendRedirect("/location");
2.5 GenericServlet类
2.6 HttpServlet类GenericServlet实现了Servlet接口,将接口中的其他方法都做了默认实现,只是将service()方法作为抽象方法
如果通过集成GenericServlet来实现Serlvet类,只需要重写service方法即可,其他的方法,根据需要来选择是否重写
3.Servlet获取表单数据HttpServlet继承了GenericServlet类,通过其对GenericServlet类的扩展,可以很方便的对HTTP 请求进行处理及响应.
login.jsp
login
loginServlet.ava获取登录页面的参数并处理
package com.lxg.session;
@WebServlet("/loginServlet")
public class LonginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
req.setCharacterEncoding("utf-8");
//获取参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String checkCode = req.getParameter("checkCode");
//获取生成的验证码
HttpSession session = req.getSession();
String checkCode_session = (String)session.getAttribute("checkCode_session");
//删除session
session.removeAttribute("checkCode_session");
//先判断验证码是否正确
if(checkCode_session!=null && checkCode_session.equalsIgnoreCase(checkCode)){
//忽略大小写比较字符串
//验证码一致
if("zhangsan".equals(username)&&"123".equals(password)){
//登录成功
//存储用户信息
session.setAttribute("user",username);
//重定向到success.jsp
resp.sendRedirect(req.getContextPath()+"/success.jsp");
}else{
//登录失败
req.setAttribute("login_error","用户名或密码错误");
//转发到登录页面
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
//判断用户名和密码是否一致
}else{
//验证码不一致
//存储提示信息到request中
req.setAttribute("cc_error","验证码不一致");
//转发到登录页面
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
}
4.Servlet之间的跳转
1.转发(forward)
转发是通过requestDispatcher对象的forward(httpServletRequest req,HttpServletResponse res)方法来实现的。
request.getRequestDispatcher("/servlet/LifeCycleServlet").forward(request,response);
其中getRequestDispatcher方法的参数,必须以“/”开头,表示web的根目录,比如要 跳转: ”http://locahost:8080/servlet/servet/LifeCycleServlet”, 则参数为”/servlet/LifeCycleServlet”.
2.重定向(redirect)
5.获取初始化参数通过httpServlet的sendDirect(String location)方法。
- 在 web.xml中配置servlet时,可以配置一些初始化参数,在servlet可以通过servletConfig接口提供的接口获取这些参数。
在web.xml中配置init-param 参数:
HelloServlet servlet.HelloServlet username forezp
在servlet中获取
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
String name=this.getInitParameter("username");
System.out.println(name);
}
}
部署项目,访问helloServlet就可以看见在控制台打印了forezp
2.也可以配置一些全局的参数:context-param.
index.jsp haha xixi
获取方式:
servlet中通过getServletContext()获取servletContext对象,使用ServletContext的getInitParameter()方法获取制定参数名来获取参数。
ServletContext servletContext=getServletConfig().getServletContext();
String str=servletContext.getInitParameter("haha");
System.out.println(str);
6.servlet九大内置对象



