兄弟姐妹们我又来啦
看了之前我的博客应该可以看到我的很多java方法都是写到do开头的文件里,今天呢就是对这些文件进行优化,也就是编写自己的servlet。
我们今天的任务主要是:
1.干掉所有doxxx.jsp的页面
2.编写java文件来代替doxxx.jsp
3.Servlet接口具备接收前端请求的功能
面向对象有三要素:封装、继承、多态
今天我们用登录来做实例
首先创建一个简单的登录界面
<form action="" method="post">
<p><input type="text" name="username"></p>
<p><input type="text" name="password"></p>
<p>
<button>登录</button>
</p>
</form>
我们创建一个包,包里创建一个类(需要实现servlet接口)
servlet接口中有五个方法
初始化:第一次进来: 当请求来到这个servlet 就会调用init方法
public void init(ServletConfig servletConfig) throws ServletException {
}
服务:所有的代码全部写在这个方法中
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
}
销毁:
什么时候销毁
1.服务关闭了
2.这个类被修改
public void destroy() {
}
得到配置
public ServletConfig getServletConfig() {
return null;
}
得到信息
public String getServletInfo() {
return null;
}
实现登录请求的处理
package com.zking.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Description 用来实现登录请求的处理
**/
@SuppressWarnings("all")
public class LoginServlet implements Servlet {
//生命周期
@Override //init 初始化
public void init(ServletConfig servletConfig) throws ServletException {
//第一次进来: 当请求来到这个servlet 就会调用init方法
System.out.println("开始初始化");
}
@Override //服务
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
HttpServletResponse response = (HttpServletResponse) resp;
HttpServletRequest request = (HttpServletRequest) req;
//所有的代码全部写在这个方法中
req.setCharacterEncoding("utf-8");
//取到用户数据
String username = req.getParameter("username");
String password = req.getParameter("password");
//通过响应对象获取了输出对象
PrintWriter out = response.getWriter();
//取session通过请求对象
HttpSession session = request.getSession();
//取application通过请求对象 context->容器
ServletContext application = request.getServletContext();
//走数据库
if("root".equals(username)&&"root123".equals(password)){
//登录成功
out.println("登录成功");
}else{
//登录失败
out.println("登录失败");
}
}
@Override //销毁
public void destroy() {
//1.服务关闭了
//2.这个类被修改了
System.out.println("我销毁了");
}
@Override //得到配置
public ServletConfig getServletConfig() {
return null;
}
@Override //得到信息
public String getServletInfo() {
return null;
}
}
注:pageContext拿不到
取application通过请求对象的单词与其他两个不同
但是现在我们还用不了,我们需要设置一个访问路径
给servlet配置访问路径
<?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>web20</display-name>
<welcome-file-list>
<welcome-file>/index.html</welcome-file>
</welcome-file-list>
<!-- 如果修改了这个 一定要重启服务器 -->
<!-- 1.配置servlet -->
<servlet>
<!-- 给他取一个名字 -->
<servlet-name>one</servlet-name>
<!-- servlet-class需要填上类的全路径 -->
<servlet-class>com.king.servlet.LoginServlet</servlet-class>
</servlet>
<!-- 2.配置servlet的访问路劲 -->
<!-- mapping映射 -->
<servlet-mapping>
<!-- 对应的servlet的名字 -->
<servlet-name>one</servlet-name>
<!-- 给他配置一个访问的路径 路径必须加/-->
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
</web-app>
注:配置的路径必须是“/”开头后面的名字可以自己随便写
需要在首页中添加这个界面设置配置路径
<form action="login.do" method="post">
<p><input type="text" name="username"></p>
<p><input type="text" name="password"></p>
<p>
<button>登录</button>
</p>
</form>
到实现类先进初始化再进服务
但是这样的写法有些麻烦
传统的开发模式:配置式开发
注解式开发: @注解
上面的是用的实现方法,那么现在我们用继承方法来进行操作吧
首先在包中创建一个类,继承HttplServlet
public class MyServlet extends HttpServlet{
}
我们可以继承到两个方法
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
他们针对不同的请求方式:
doGet 专门处理get请求
doPost 专门处理post请求
但是有些(比如表单)既有get请求又有post请求,那我们可以直接在doGet中添加doPost方法
然后直接在doPost方法中写登录验证就ok了
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//登录功能
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//登录功能
//取到用户数据
String username = req.getParameter("username");
String password = req.getParameter("password");
resp.setCharacterEncoding("gb2312");
// 【utf-8】【gb2312】【big5】
//通过响应对象获取了输出对象
PrintWriter out = resp.getWriter();
//取session通过请求对象
HttpSession session = req.getSession();
//取application通过请求对象 context->容器
ServletContext application = req.getServletContext();
//走数据库
if("root".equals(username)&&"root123".equals(password)){
//登录成功
out.println("登录成功");
}else{
//登录失败
out.println("登录失败");
}
}
我们还是需要给servlet配置访问路径,用注解的方法
@WebServlet("/test.do")//直接填访问路径
然后在首页添加路径就可以了
支持中文的三种编码
- 【utf-8】
- 【gb2312】
- 【big5】
如果乱码就在输出前设置中文编码
resp.setCharacterEncoding("gb2312");
今天就到这咯,下次见宝们