5.1 什么是servlet
全称Java Servlet,是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其它HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层,负责接收和处理HTTP请求
5.2 servlet配置
1.web.xml
2.注解配置(适合tomcat6.0以上)
urlPattrens为必配置项
5.3 request和response对象
在Servlet中通过request对象可以取到jsp页面传过来的参数
新建一个登陆的login.jsp页面,使用表单,如果用户名与密码相同则跳转到main.jsp页面,否则输出登录失败
新建一个servlet,名为Login,URL 修改为Login.do
Login.java文件如下
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;
/**
* Servlet implementation class Login
*/
@WebServlet("/Login.do")
public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Login() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
//通过request,获得jsp页面的两个参数,为登录行为做逻辑判断
String userName=request.getParameter("username");
String userPassword=request.getParameter("userpassword");
if(userName.equals(userPassword))
{
//通过response,跳转到main
response.sendRedirect("main.jsp");
}else {
//通过response输出登陆失败
response.setContentType("text/html; charset=utf-8");
response.getWriter().write("登陆失败!!");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//doGet(request, response);
response.setCharacterEncoding("utf-8");//解决中文乱码问题
String userName=request.getParameter("username");
String userPassword=request.getParameter("userpassword");
if(userName.equals(userPassword))
{
//通过response,跳转到main
response.sendRedirect("main.jsp");
}else {
//通过response输出登陆失败
response.setContentType("text/html; charset=utf-8");
response.getWriter().write("登陆失败!!");
}
}
}
通过以上的小demo,我们可以理解到request和response,分别是请求和返回
但是如果用户名和密码如果都为汉字的情况下,虽然可以登录成功,但是其传给服务器的值却是乱码,可以通过以下的两个方法
1.post方式解决中文乱码
response.setCharacterEncoding("utf-8");
注意将其放在获取参数之前,最前面才有效,以上针对post方法
2.get方式解决中文乱码
userName=new String (userName.getBytes("ISO-8859-1"),"utf-8");
ISO-8859-1是默认的编码方式
5.4 Servlet生命周期
引入
1、Servlet本质上是一个类,但是使用它的时候,你好像从来没有new出来过,那么它是什么时候被创建的呢?
2、Servlet都是继承自HttpServlet的,你写代码的时候会重写父类的若干个方法,如init,doGet,doPost等,你重写这么多方法,它们之间的执行顺序又是如何呢?
🙂嗯,带着以上两个问题进入生命周期的学习
Servlet整个生命周期的管理,是由Servlet容器(这里是Tomcat)
我们新建一个servlet来观察这几个函数的调用顺序,来学习servlet生命周期
代码块如下:
package com.iflytek.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ServletLifeCycleTest
*/
@WebServlet(
urlPatterns = {
"/ServletLifeCycleTest",
"/ServletLifeCycleTest.do"
},
initParams = {
@WebInitParam(name = "testParam", value = "testParam")
})
public class ServletLifeCycleTest extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ServletLifeCycleTest() {
super();
//构造函数,new
System.out.println("cycletest:new");
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("cycletest:init");
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
System.out.println("cycletest:destroy");
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("cycletest:service");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("cycletest:doGet");
//response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("cycletest:doPost");
//doGet(request, response);
}
}
new->init->service(无论get、post,service都是先调用)->doget->destory
特点:
1.不管是执行doGet还是doPost,service方法都会在其之前
2.init、new 只调用一次,下次启动tomcat时才会重新调用
3. 如果不重写service,且没有调用父类service,则不调用dopost、doget