跳转方式:转发与重定向

跳转方式:转发与重定向_第1张图片
跳转方式:转发与重定向_第2张图片
跳转方式:转发与重定向_第3张图片

跳转方式:转发与重定向_第4张图片
跳转方式:转发与重定向_第5张图片
跳转方式:转发与重定向_第6张图片
跳转方式:转发与重定向_第7张图片

跳转方式:转发与重定向_第8张图片
跳转方式:转发与重定向_第9张图片
跳转方式:转发与重定向_第10张图片
跳转方式:转发与重定向_第11张图片
跳转方式:转发与重定向_第12张图片
跳转方式:转发与重定向_第13张图片
跳转方式:转发与重定向_第14张图片
跳转方式:转发与重定向_第15张图片
跳转方式:转发与重定向_第16张图片
跳转方式:转发与重定向_第17张图片
跳转方式:转发与重定向_第18张图片
跳转方式:转发与重定向_第19张图片
跳转方式:转发与重定向_第20张图片

创建一个名为29web1的web项目
在web里新建一个regist.html文件
regist.html第九行
action:规定当提交表单时,向何处发送表单数据。默认为当前页面
method:规定如何发送表单数据(即提交方式,常用get或post),默认get
enctype就是encodetype就是编码类型的意思,前端表单提交时用application/x-www-form-urlencoded
点完提交按钮,要提交给registservlet

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册title>
head>
<body>
    <h1>用户注册h1>
    <form action="registservlet" method="post" enctype="application/x-www-form-urlencoded">
        <table>
            <tr>
                <td>用户名td>
                <td>
                    <input type="text" name="username">
                td>
            tr>
            <tr>
                <td>密码td>
                <td>
                    <input type="password" name="pwd1">
                td>
            tr>
            <tr>
                <td>密码td>
                <td>
                    <input type="password" name="pwd2">
                td>
            tr>
            <tr>
                <td>邮箱td>
                <td>
                    <input type="email" name="email">
                td>
            tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="提交">
                td>
            tr>
        table>
    form>
body>
html>

再创建一个包com.qf.servlet
把tomcat加进来(必须先把tomcat加进来,然后再创建servlet)
在这个包里面创建一个servlet

小问题:创建servlet时发现没有servlet选项
查了一下资料发现没有servlet-api.jar包
按照如下图片顺序操作,把servlet-api.jar包导进来
跳转方式:转发与重定向_第21张图片
跳转方式:转发与重定向_第22张图片
跳转方式:转发与重定向_第23张图片
这样就可以创建servlet啦
跳转方式:转发与重定向_第24张图片

不过我发现不仅可以这样创建,
还可以这么创建(但是好像要在里面写些东西才可以):

跳转方式:转发与重定向_第25张图片
第15行,配置一个访问路径,叫urlPatterns
19行设置编码为utf-8
14-17行接收数据

package com.qf.servlet;

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

@WebServlet(name = "RegistServlet", urlpatterns = "/registservlet")
public class RegistServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收数据
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String pwd1 = request.getParameter("pwd1");
        String pwd2 = request.getParameter("pwd2");
        String email = request.getParameter("email");
        //校验(没有先不做)
        //创建业务对象(没有先不做)
        System.out.println(username+"..."+pwd1+"..."+pwd2+"..."+email);

        //注册成功,转发成功提示页面
        //RequestDispatcher dispatcher = request.getRequestDispatcher("/success.html");
        //dispatcher.forward(request, response);
        request.getRequestDispatcher("/success.html").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	doPost(request, response);
    }
}

小知识点:url不区分大小写
urlPatterns = “/RegistServlet” 和 urlPatterns = "/registservlet"一样

小知识点:urlPatterns和value是一样的,都表示指定拦截路径的意思。
urlPatterns和value只能配置一个,不能两个都配置,两个都配置就会报错。

小知识点:RequestDispatcher.forward(request, response)
这个方法将请求从一个 Servlet or JSP目标资源 上 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件,这些资源必须是当前Web上下文中的),让其它的资源去生成响应数据。
例如用户请求的是目标资源A,A接受到请求后,转发到B,真正产生响应数据是被转发的资源B,而A只是起个引导转发作用。浏览器的地址栏不会变,依然是A的URL。
这个方法可以允许被请求的目标资源做一些准备工作后,再让转发的资源去响应请求。

注释这两行和第三行等价
//RequestDispatcher dispatcher = request.getRequestDispatcher(“/success.html”);
//dispatcher.forward(request, response);
request.getRequestDispatcher(“/success.html”).forward(request, response);

success.html建在web里面

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
    <h1>注册成功h1>
body>
html>

运行,出现了
跳转方式:转发与重定向_第26张图片

地址栏加上/regist.html,运行一下
跳转方式:转发与重定向_第27张图片
小知识点:
webapps:tomcat默认部署路径
wtpwebapps:myeclipse默认部署路径

小知识点:
war exploded模式是将WEB工程以当前文件夹的位置关系上传到服务器,即直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。

跳转方式:转发与重定向_第28张图片
随意输入一个账号,回车
*小问题:*运行出现500错误,查了一下,出现这种问题,是没有将jar文件放到WEB-INF的lib目录下
跳转方式:转发与重定向_第29张图片
再进一步发现自己没有在WEB-INF下创建classes和lib,classes用来存放out文件(等等用得上),lib用来存放依赖包
当创建时又出现了问题,原本应该时Directory是地方变成了Package,又查了一下,下图这么做就可以整回来啦
intellij idea里Mark Directory As Excluded的含义:
排除掉当前文件夹,如果文件夹是source文件夹,排除了,就变成普通文件夹,不再认为是source,就不会编译当前文件夹内部的java到classpath里
将文件标记为Excluded目录后,idea就不会为该文件创建索引,全局搜索也不会搜里面的内容,编辑代码不会智能提示,Excluded Folders相当于代码废弃场
跳转方式:转发与重定向_第30张图片
将jar文件放到WEB-INF的lib目录下:
跳转方式:转发与重定向_第31张图片
跳转方式:转发与重定向_第32张图片
跳转方式:转发与重定向_第33张图片
在这里插入图片描述
可是问题还没有解决,再寻找问题,发现是get和Post写反了 千万不能再错了!!!!!! ( T∧T)
小知识点:servlet中doGet()和doPost()的用法:
一般来说我们是用不到doGet方法的,doGet方法提交表单的时候会在url后边显示提交的内容,所以不安全。而且doGet方法只能提交256个字符(1024字节),而doPost没有限制,因为get方式数据的传输载体是URL(提交方式能form,也能任意的URL链接),而POST是HTTP头键值对(只能以form方式提交)。通常我们使用的都是doPost方法,你只要在servlet中让这两个方法互相调用就行了,例如在doGet方法中这样写(下面的代码):
再把业务逻辑直接写在doPost方法中。servlet碰到doGet方法调用直接就会去调用doPost因为他们的参数都一样。而且doGet方法处理中文问题很困难,要写过滤器之类的。

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        doPost(request,response);
    }

填好内容,点击提交
跳转方式:转发与重定向_第34张图片
变成:
跳转方式:转发与重定向_第35张图片
跳转方式:转发与重定向_第36张图片
转发举例:
跳转方式:转发与重定向_第37张图片

*小知识点:*开发servlet为什么要配置web.xml文件
web.xml其实就是servlet的一个配置文件,通过这个配置文件来寻找对应的servlet处理业务。

sun公司就是这样设计,容器通过配置文件web.xml找相应的servlet这样有助于灵活和可维护性。具体用法如下:

MyServlet //这里是servlet 的名字,自己定义 的 Servlet //这里是servlet的位置 。 如果在 一个包下, 就写 包名.类名 MyServlet //这里跟 上面的;servlet-name 必须一样 /abc //这里 在地址 输入访问的 时候 输入的,自己定义 (真正在URL地址栏里需要输入的内容)

告诉别人怎么找到你的servlet,与对应

通俗地讲,就是:配置web.xml是让容器知道所发送过来的请求是由哪个servlet处理,然后把httprequest和httpresponse对象注入到该servlet中
跳转方式:转发与重定向_第38张图片
在RegistServlet.java中写入:

//向request添加数据
        request.setAttribute("money","1000000");
        request.setAttribute("gift","中华,茅台...");

        //获取数据
        String money = (String) request.getAttribute("money");
        String gift = (String)request.getAttribute("gift");
        System.out.println(money+"..."+gift);

        //删除request数据
        request.removeAttribute("money");
        request.removeAttribute("gifft");

整体代码:

package com.qf.servlet;

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

@WebServlet(name = "RegistServlet", urlPatterns = "/registservlet")
public class RegistServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收数据
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String pwd1 = request.getParameter("pwd1");
        String pwd2 = request.getParameter("pwd2");
        String email = request.getParameter("email");
        //校验(没有先不做)
        //创建业务对象(没有先不做)
        System.out.println(username+"..."+pwd1+"..."+pwd2+"..."+email);

        //注册成功,转发成功提示页面
        //RequestDispatcher dispatcher = request.getRequestDispatcher("/success.html");
        //dispatcher.forward(request, response);
        //向request添加数据
        request.setAttribute("money","1000000");
        request.setAttribute("gift","中华,茅台...");

        //获取数据
        String money = (String) request.getAttribute("money");
        String gift = (String)request.getAttribute("gift");
        System.out.println(money+"..."+gift);

        //删除request数据
        request.removeAttribute("money");
        request.removeAttribute("gifft");

        request.getRequestDispatcher("/success.html").forward(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

运行,填好信息,提交,idea里打印出来了
跳转方式:转发与重定向_第39张图片

重定向

跳转方式:转发与重定向_第40张图片
在web里再新建一个login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
    <h1>用户登录</h1>
    <form action="loginservlet" method="post">
        <table>
            <tr>
                <td>用户名</td>
                <td>
                    <input type="text" name="users">
                </td>
            </tr>
            <tr>
                <td>密码</td>
                <td>
                    <input type="password" name="pwd">
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="登录">
                    <input type="reset" value="重填">
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

地址栏输入http://localhost:8080/29web1_war_exploded/login.html然后会到servlet
接下来需要写个LoginServlet
重定向if,else部分的代码:
表示如果账户名是admin,并且密码是888,就会重定向到首页,地址后半部分会变成index.jsp;如果不是,则会重定向到登录页面,地址后半部分会变成login.html

        if("admin".equals(username)&&"888".equals(pwd)){
            //成功重定向到首页
            response.sendRedirect("index.jsp");
        }
        else {
            //重定向到登录页面
            response.sendRedirect("login.html");
        }

LoginServlet的全部代码:

package com.qf.servlet;

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

@WebServlet(name = "LoginServlet", urlPatterns = "/loginservlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收数据
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");
        System.out.println(username+"..."+pwd);
        if("admin".equals(username)&&"888".equals(pwd)){
            //成功重定向到首页
            response.sendRedirect("index.jsp");
        }
        else {
            //重定向到登录页面
            response.sendRedirect("login.html");
        }

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

再改一下index.jsp
index.jsp的代码:(就只改个登录成功这四个字就成)

<%--
  Created by IntelliJ IDEA.
  User: 玉想琼思
  Date: 2022/9/29
  Time: 16:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <h1>登录成功</h1>
  </body>
</html>

输入错误的账号密码:
跳转方式:转发与重定向_第41张图片
跳转方式:转发与重定向_第42张图片

输入正确的账号密码:
跳转方式:转发与重定向_第43张图片
跳转方式:转发与重定向_第44张图片

重定向举例:
跳转方式:转发与重定向_第45张图片
跳转方式:转发与重定向_第46张图片
跳转方式:转发与重定向_第47张图片
在这里插入图片描述
比如在LoginServlet.java里添加
变成这样:response.sendRedirect("index.jsp?money=100000&gift=maotai,zhonghua");
浏览器的地址栏就会有这些东西

大问题:啊啊啊啊啊啊啊啊我好抓狂,为什么我的重定向地址没有改变但是内容改变了,我找不到原因 T∧T

你可能感兴趣的:(Web应用开发笔记,java)