在之前的学习中,我们已经经过了以下几个部分:
- 封装javabean
- 操作集成到doxx.jsp
- 用JSTL替换Java的遍历、取值操作
在以上的过程中,我们的doxxx.jsp只包含Java代码,用来操作数据库。那么我们想一下为什么这么多的doxxx.jsp文件不能用一个Java.class来实现?
我们的servlet接口就是用来实现这个功能的。
操作步骤主要以下面几点为主:
- 去除doxxx.jsp
- 新建Java文件
- 实现servlet接口
- 重写service
- 提供访问路径
- 继承HTTPServlet(class)
当用户访问此jsp的时候,就转接到Java。
实现Servlet接口:
实现接口后会出现五个方法,相当于servlet的是生命周期。
package com.ljq.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 用来实现登录请求处理
*
* @author 一麟
*
*/
@SuppressWarnings("all")
public class LoginServlet implements Servlet {
@Override // 销毁
public void destroy() {
// 服务被关闭或者修改的时候就会调用这个方法
}
@Override // 得到配置
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override // 获得信息
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override // 初始化
public void init(ServletConfig arg0) throws ServletException {
// 当请求第一次进来的时候就会调用这个方法
}
@Override // 服务
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
1.重写servlet
在生命周期中的servlet这个方法,我们需要将我们之前的处理登录的方法写入这个方法中来。
tip:通过我们传进来的参数可以拿到application,session,request,response(除了pageContext以外其他都能获得),当然也能实现转发。
@Override // 服务
public void service(ServletRequest SRQ, ServletResponse SRP) throws ServletException, IOException {
// 直接在servlet接口中拿不到request和respsonse,这个时候我们就需要强转为子接口(HttpServletRequest&HttpServletResponse)再拿请求和响应
HttpServletRequest request = (HttpServletRequest) SRQ;// 获得请求
HttpServletResponse response = (HttpServletResponse) SRP;// 获得响应
// 请求拿过来的值应为编码不一致可能会乱码,这个时候我们就需要通过请求设置编码
// 在这里可能还会遇到一个问题:当我们设置了中文编码后还会出现乱码的问题,我们可以尝试去换种编码,主要的中文编码有:
// [utf-8] [gb2312] [big5] [gbk]
SRQ.setCharacterEncoding("utf-8");// 设置编码
// 接收用户数据
String username = SRQ.getParameter("username");
String password = SRQ.getParameter("password");
// 通过响应对象获取了输出对象
PrintWriter out = response.getWriter();
// 通过请求对象获取session
HttpSession session = request.getSession();
// 通过请求对象获取application(在ServletContext服务容器中获得)
ServletContext application = request.getServletContext();
// 经过数据库
if ("root".equals(username) && "root123".equals(password)) {// 注意:在做判断的时候一定不能拿空值取调用equals方法,一定会报空指针错误
// 登录成功
out.println("登录成功");
} else {
// 登录失败
out.println("登录失败");
}
}
2.配置路径(web.xml)
注意:我们在每次修改了web.xml之后一定要记得重启服务器。
web.xml这个文件之前一直没有提,那么这个文件是用来干嘛的?
web.xml其实就是我们整个项目的配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<display-name>servlet</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--1.配置servlet -->
<servlet>
<!--给它取一个名字(name是没有限制的,可以随便取) -->
<servlet-name>begin</servlet-name>
<!--servlet-class需要填上类的全路径 -->
<servlet-class>com.zking.servlet.LoginServlet</servlet-class>
</servlet>
<!--2.配置servlet的访问路径 -->
<!--mapping映射 -->
<servlet-mapping>
<!--对应的servlet的名字(与上面name必须要一致) -->
<servlet-name>begin</servlet-name>
<!--给它配置一个访问的路径(这里的name也是一样的,随意的) -->
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
</web-app>
注意:在配置完路径重启项目我们可能会出现一个错误:
servlet映射中的<url-pattern>/login.do</url-pattern>无效
除了上面直接实现servlet接口这种方法其实还有一种,就是直接继承servlet的接口(HttpServlet ):
两种访问方式(get/post):
- get:通过地址栏携带数据,网页中的链接全部都是get
- post:参数不会显示在状态栏,并且没有长度限制。
继承类(MyServlet.class):
package com.ljq.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;
/**
* servlet子接口继承类(可以自定义)
*
* @author 一麟
*
*/
@SuppressWarnings("all")
@WebServlet("/login.do") // 直接配置路径,就不需要再去web.xml里面配置路径了
public class MyServlet extends HttpServlet {
// 处理get请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
// 处理post请求
@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");
// 通过响应对象获取了输出对象
PrintWriter out = resp.getWriter();
// 通过请求对象获取session
HttpSession session = req.getSession();
// 通过请求对象获取application(在ServletContext服务容器中获得)
ServletContext application = req.getServletContext();
// 经过数据库
if ("root".equals(username) && "root123".equals(password)) {// 注意:在做判断的时候一定不能拿空值取调用equals方法,一定会报空指针错误
// 登录成功
out.println("登录成功");
} else {
// 登录失败
out.println("登录失败");
}
}
}
index.jsp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="test.do" method="post">
<p>
<input type="text" name="username">
</p>
<p>
<input type="text" name="password">
</p>
<p>
<button>登录</button>
</p>
</form>
</body>
</html>
好啦这期主要讲解servlet的概念以及基本使用,后续会带来项目的应用ヾ(◍°∇°◍)ノ゙。