JavaWeb学习之Servlet

6.1 Servlet项目的准备

  • 新建项目ServletTest1

在这里插入图片描述

  • ① 添加框架支持

在这里插入图片描述

选择Web应用程序,添加

在这里插入图片描述

在这里插入图片描述

  • ② 导入所需要的jar包

在这里插入图片描述

添加jspservlet 两个jar包

③ Servelt项目准备工作完成啦

在这里插入图片描述

在这里插入图片描述

④ 最后一步,部署tomcat

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.2 Servlet部署

6.2.1 部署的两种方式

  • ① 在web.xml中部署Servlet,该文件在WEB-INF下(作者部署之后打开jsp文件出了毛病)

在这里插入图片描述

给loginServlet通过xml方式部署(红色方框)

在这里插入图片描述

对于这种方式的部署,你会发现有点麻烦,所有的代码文件都需要自己手动书写,效率不高

  • ② 基于注解的方式部署(推荐)

在这里插入图片描述

6.2.2 部署相关标记的说明

  • <web.xml>根标记

部署东西都往这里写就对了

  • servlet标记和子标记servlet-name,servlet-class

servlet里面放子标记,对应一些信息
servlet-name给他一个别名、有点像通过类创建的实例名
servlet-class根据那个类创建的

  • servlet-mapping标记和子标记

servlet-mapping:内容就是告诉电脑把哪个部署到服务器了
servlet-name :这里面的就是跟电脑说我上一步创建的实例我要部署服务器了
url-pattern:部署到服务器之后访问的方式

  • @WebServlet
    书写方式:@WebServlet(name="loginServlet",urlPatterns={"/second"})
    解释,为啥他就这么简单,只有两个东西呢。

因为你是在本类中书写,自然不用指定哪个类,给个名字,然后部署咋访问就行啦

6.3 通过JSP访问Servlet

6.3.1 实例:login.jsp和loginServlet

  • login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>login.jsp</title>
</head>
<body>
    <form action="../loginServlet">
        账号:<input type="text" name="user"><br>
        密码:<input type="password" name="pwd"><br>
        <input type="submit" value="提交">
        <input type="reset" value="重置">
    </form>
</body>
</html>
  • loginServlet(在Servlet下创建,选servlet类)

package servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "loginServlet", value = "/loginServlet")
public class loginServlet extends HttpServlet {
    
    
    private static final long serialVersionUID=1L;
    protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
    
    
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();
        request.setCharacterEncoding("utf-8");
        String name=request.getParameter("user");
        String password=request.getParameter("pwd");
        out.println("<html><body>");
        if (name==null||name.length()==0){
    
    
            out.println("请输入用户名");
        }
        else if (password==null||password.length()==0){
    
    
            out.println("请输入密码");
        }
        else if (name.length()>0&& password.length()>0){
    
    
            if (name.equals("zhangsan")&& password.equals("123456")){
    
    
                out.println("信息输入正确");
            }else{
    
    
                out.println("信息输入错误");
            }
        }
        out.println("</body></html>");
    }
}

6.3.2 Servlet中的service和doPost,doGet方法

① service方法

服务器在接收Servlet请求之后,产生新线程,调用service()方法为请求做出相应。service()方法首先检查HTTP请求类型(get or post),然后根据类型调用doGet()和doPost()方法。所以,我们现在主流的方式是直接书写doPost()和doGet()方法

② doPost()和doGet()

通常情况下,无论请求方式为get或是post,服务器的处理过程都完全相同,那么我们就可以只在doPost()中书写处理过程,然后doGet()只需要再调用doPost()方法即可

下面是代码示例

package servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "loginServlet", value = "/loginServlet")
public class loginServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();
        request.setCharacterEncoding("utf-8");
        String name=request.getParameter("user");
        String password=request.getParameter("pwd");
        out.println("<html><body>");
        if (name==null||name.length()==0){
    
    
            out.println("请输入用户名");
        }
        else if (password==null||password.length()==0){
    
    
            out.println("请输入密码");
        }
        else if (name.length()>0&& password.length()>0){
    
    
            if (name.equals("zhangsan")&& password.equals("123456")){
    
    
                out.println("信息输入正确");
            }else{
    
    
                out.println("信息输入错误");
            }
        }
        out.println("</body></html>");
    }
}

6.6 重定向和转发

6.6.1 为啥要重定向?转发又是怎么做的

  • 重定向:sendRedirect(String location)

假如你提交的信息需要通过你的loginServlet后再到另一个界面,那么这时候就需要通过重定向的方式来保留原本的request存储的一些信息,不同过这种方式的信息无法保留

  • 转发:

① 创建转发对象

RequestDispatcher dis=request.getRequestDispatcher(String url)

② 调用方法,将信息传递,并跳转

dis.forward(request,response)

6.6.2 重定向实践

  • redirectForward.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>redirectForward.jsp</title>
</head>
<body>
    <form action="../RedirectForwardServlet" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="user"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="pwd"></td>
            </tr>
            <tr>
                <td><input type="submit" value="提交" ></td>
                <td><input type="reset" value="重置"></td>
            </tr>
        </table>
    </form>
</body>
</html>
  • RedirectForwordServlet

package servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "RedirectForwardServlet", value = "/RedirectForwardServlet")
public class RedirectForwardServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");
        PrintWriter out=response.getWriter();
        String name=request.getParameter("user");
        String password=request.getParameter("pwd");
        if (name==null||name.length()==0){
    
    
            response.sendRedirect("jsp/redirectForward.jsp");

        } else if (password==null||password.length()==0) {
    
    
            response.sendRedirect("jsp/redirectForward.jsp");
        } else if (name.length()>0&&password.length()>0) {
    
    
            RequestDispatcher dis=request.getRequestDispatcher("ShowServlet");
            dis.forward(request,response);
        }
    }
}

  • ShowServlet

package servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "ShowServlet", value = "/ShowServlet")
public class ShowServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();
        request.setCharacterEncoding("utf-8");

        String name=request.getParameter("user");
        String password=request.getParameter("pwd");
        out.println("您的账号是:"+name);
        out.println("您的密码是:"+password);
    }
}

6.7 基于Servlet的MVC模式

6.7.1 MVC模式组成

  • 模型:一个或多个JavaBean对象,用于存储数据(实体模型,由JavaBean类创建)和处理业务逻辑
  • 视图:一个或多个JSP页面,向控制器提交数据和为模型提供数据显示,JSP页面主要使用HTML标记和JavaBean标记来显示数据。
  • 控制器:一个或多个Servlet对象,根据视图提交的请求进行控制,即将请求转发给业务逻辑的JavaBean,并将处理结果存放到实体模型JavaBean中,输出给视图显示。

6.7.2 MVC实例

  • ① 定义实体模型来表示数据

User类用于创建实体模型存储用户信息

package Model;

public class User {
    
    
    private String name;
    private String pwd;
    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getPwd() {
    
    
        return pwd;
    }

    public void setPwd(String pwd) {
    
    
        this.pwd = pwd;
    }
}
  • ② 定义业务逻辑来处理业务

UserCheck类用于判断用户名和密码是否正确,代码如下:

package Model;
import Model.User;

public class UserCheck {
    
    
    public boolean validate(User user){
    
    
        if (user!=null&&user.getName().equals("JSPMVC")){
    
    
            if (user.getPwd().equals("MVC")){
    
    
                return true;
            }else
                return false;
        }else {
    
    
            return false;
        }
    }
}
  • ③ 编写Servlet处理请求

LoginCheckServlet完成请求控制,代码如下:

package servlet;

import Model.User;
import Model.UserCheck;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "LoginCheckServlet", value = "/LoginCheckServlet")
public class LoginCheckServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        request.setCharacterEncoding("utf-8");
        String name=request.getParameter("user");
        String password=request.getParameter("pwd");
        User user=new User();
        user.setName(name);
        user.setPwd(password);
        UserCheck userCheck=new UserCheck();
        if(userCheck.validate(user)){
    
    
            request.setAttribute("user",user);
            RequestDispatcher dis=request.getRequestDispatcher("jsp/loginSuccess.jsp");
            dis.forward(request,response);
        }else {
    
    
            response.sendRedirect("jsp/loginCheck.jsp");
        }
    }
}
  • ④ 编写视图

登录页面loginCheck.jsp的代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>loginCheck.jsp</title>
</head>
<body>
  <form action="../LoginCheckServlet" method="post">
    <table>
      <tr>
        <td>用户名:</td>
        <td><input type="text" name="user"></td>
      </tr>
      <tr>
        <td>密码:</td>
        <td><input type="password" name="pwd"></td>
      </tr>
      <tr>
        <td><input type="submit" value="提交" ></td>
        <td><input type="reset" value="重置"></td>
      </tr>
    </table>
  </form>
</body>
</html>

登录成功页面loginSuccess.jsp的代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>loginSuccess.jsp</title>
</head>
<body>
  <jsp:useBean id="user" type="Model.User" scope="request"/>
  恭喜<jsp:getProperty name="user" property="name"/>登陆成功!
</body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_57663206/article/details/127209107