servlet与jsp跳转方法及问题

Java 专栏收录该内容
16 篇文章 0 订阅

记录了一些自己在做项目的过程中遇到的问题和解决过程

简介

项目第一步注册与登录。项目采用的是SpringBoot+mybatis.登录注册页面是用jsp+servlet来写的。以下没有完整记录代码, 就是记录了一些关键步骤和知识点以及遇到的问题和解决方法。

from表单提交到servlet

jsp页面中的信息需要通过表单提交给servlet来处理。下面看一下提交方法。

  1. 创建一个servlet类
    登录的servlet类

该servlet需要继承HttpServlet类并重写相应的doGet和doPost方法。

  1. web.xml 注册servlet---->动态页面jsp需要配置,让浏览器知道请求分发到哪一个servlet。
    <!--    配置servlet跳转信息-->
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.tang.share_nice.service.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

<servlet-name>LoginServlet</servlet-name>下面对应的<servlet-class>对应相应的servlet的包路径

  1. form表单提交数据
 <form action="login" method="post">
        <table style="margin-left:40%">
            <marquee width="200" scrolldelay="250">用户登录</marquee>

            <tr>
                <td>用户名:</td>
                <td><input type="text" size="21" name="username"/></td>

            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="text" name="password" size="21"/></td>
            </tr>

        </table>
        <input type="submit" value="登录"/>
        <input type="reset" value="重置"/>
    </form>

要注意的是:form表单中的action对应web.xml配置的url-pattern
<url-pattern>/login</url-pattern><==>action=“login”

通过上面三个步骤的配置,在点击表单的提交按钮是,就可以成功通过post方法将请求交给servlet来处理。

jsp页面跳转

web项目中的安全目录是WEB-INF,这个页面是无法通过浏览器中输入的绝对路径访问的,需要添加一些配置

  • servlet跳转jsp

        if (login.getRet()) {
            request.getRequestDispatcher("/WEB-INF/views/success.jsp").forward(request, response);
        } else {
            request.getRequestDispatcher("/WEB-INF/views/defeat.jsp").forward(request, response);
        }

在servlet里面跳转需要通过request的forward的方法,不能使用redirect重定向。
jsp路径需要写出从WEB-INF开始的完整路径及页面名称

  • jsp跳转jsp

jsp跳转jsp也会因为安全性被限制,需要在web.xml中添加配置。

    <servlet>
        <servlet-name>register</servlet-name>
        <jsp-file>/WEB-INF/views/register.jsp</jsp-file>
    </servlet>

    <servlet-mapping>
        <servlet-name>register</servlet-name>
        <url-pattern>/registerjsp</url-pattern>
    </servlet-mapping>

配置完这个之后,就可以在jsp页面通过如下的链接访问了

    <a href="/share_nice_war_exploded/registerjsp">注册</a>

share_nice_war_exploded为项目的程序名,registerjsp为在web.xml中配置的url-pattern
除此之外也可以这样访问

    <%
        String path = request.getContextPath();
        String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <a href="<%=basePath%>registerjsp">test</a>

问题及解决方法

mapper用@Autowired进行注入的时候报空指针异常

Service层注入的mapper对象为空
在这里插入图片描述
之前以为是mybatis配置文件问题,导致没能注入成功。但是在test中测试数据库部分,是可以成功注入并且执行sql的。
后面检查 发现,是因为,在servlet层,我是 new的服务层service对象,所以导致对象内部使用注入方式实例化的对象没能注入成功。因为new出来的对象是不在Spring容器中管理的,所以没办法使用容器提供的注入方法。所以,在有用到注入来实例化对象时,前后要保持一致,要么统一使用new,要么统一使用容器提供的注入方式@Autowired或者@Resource。

servlet层无法使用@Autowired来进行注入

在找到上面的原因之后,我将servlet对象中用到的对象也进行了注入实例化。但是在debug时,service对象依旧为空。此时想到了servlet类的特殊性,他是放在servlet容器中来进行管理的,Spring也管不到他,所以注入需要使用特殊的方式

   @Override
    public void init(ServletConfig config) {
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());
    }

在servlet层添加该方法,将servlet上下文环境添加到Spring管理的上下文环境中,就能支持@Autowired注解了

  • 0
    点赞
  • 0
    评论
  • 10
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

livovil

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值