再走一个,在JSP中使用Java编写的Servlet

28 篇文章 0 订阅
24 篇文章 0 订阅

前面一篇不直接写Java Servlet,而是在Jsp中执行Java代码行吗?-CSDN博客已经说过怎么在jsp中执行java代码了,对于一些公用的请求处理和响应,如果都写在jsp中,那就有可能有多个地方重复,冗余就会很高,不如写到一个java servlet里面方便,这次就写个java servlet,然后在jsp中使用,我们看看怎么做。

还是接着上一篇的helloworld.jsp来写,不过表单里面的action我们不用deal.jsp来处理了,修改一下我们在另外一篇文章里面用到的TestServlet.java。通过一个栗子来看看创建和运行servlet-CSDN博客

一、新建LoginSucess.jsp文件

这个文件作为登录成功后的跳转页面。

二、修改TestServlet.java文件

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet(description = "This is my first Servlet", urlPatterns = { "/TestServlet" })
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public TestServlet() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//doGet(request, response);
		String username = request.getParameter("username");
		String password = request.getParameter("userpw");
		if(username.equals("123456") && password.equals("123456"))
		{
			request.getRequestDispatcher("/LoginSucess.jsp").forward(request, response);
		}
		else
		{
			response.getWriter().print("<script>alert('user name or password is error!');history.back();</script>");
		}
	}

}

三、运行HelloWorld.jsp

如果是username和password都相同就登录成功,如果不相同先弹出一个提示框,然后在返回HelloWorld.jsp页面,如果直接用

request.getRequestDispatcher("/HelloWorld.jsp").forward(request, response);

可以返回jsp内容,但通过getRequestDispatcher做请求转发,浏览器地址栏没有发生变化。

四、再修改一下Helloworld.JSP

现在输入用户名和密码后如果有一个错误就弹出窗口提示,现在想精进一下,如果username错了就在后面直接显示一个用户名错误,如果password错误了,就在密码框后面显示密码错误。我们看看怎么改。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Login demo</title>
</head>
<body>
    <div style="display: flex">
      <form name="myform" method="post" action="TestServlet" style="margin: auto">
        UserName<input name="username" type="text" />${usernameErrorString }
        <br>
        PassWord<input name="userpw" type="password" />${passwordErrorString}
        <br>
        <div>
          <input name="Submit" type="submit" value="Submit">
          <input name="Reset" type="reset" value="Reset"><br>${errorString}
        </div>
      </form>
    </div>
</body>
</html>

这里面咱们用到EL表达式,后面有这个方面的解释,这里面加了3个变量:usernameErrorString、passwordErrorString和errorString。

接下来我们在修改一下TestServlet.java文件

五、修改TestServlet.java文件

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet(description = "This is my first Servlet", urlPatterns = { "/TestServlet" })
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public TestServlet() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//doGet(request, response);
		String username = request.getParameter("username");
		String password = request.getParameter("userpw");
		if(username.equals("123456") && password.equals("123456"))
		{
			request.getRequestDispatcher("/LoginSucess.jsp").forward(request, response);
		}
		else if(!username.equals("123456")&& password.equals("123456"))
		{
			request.setAttribute("usernameErrorString", "username is error");
			request.getRequestDispatcher("/HelloWorld.jsp").forward(request, response);
		}
		else if(username.equals("123456") && !password.equals("123456"))
		{
			request.setAttribute("passwordErrorString", "password is error");
			request.getRequestDispatcher("/HelloWorld.jsp").forward(request, response);
		}
		else
		{
			request.setAttribute("usernameErrorString", "login error");
			request.getRequestDispatcher("/HelloWorld.jsp").forward(request, response);
		}
	}

}

在servlet中通过request.setAttribute给输入错误的提示赋值。

六、再次运行HelloWorld.jsp

当输入错误的信息后,会在后面显示,我们通过getRequestDispatcher做了请求转发,而不是像前面一样错误的时候通过javascript的history.back();,请求转发后是重新载入,那么错误提示变量就有值了,history.back();是回到上一个页面。

七、关于请求转发

留意一下:request.getRequestDispatcher()是请求转发,前后页面共享一个request ; 

-1、通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
-2、使用RequestDispatcher对象进行转发:void forward(ServletRequest request, ServletResponse response)
- 特点:
1、浏览器地址栏没有发生变化
2、只能转发到当前服务器内部资源中
3、转发是一次请求

八、再说两句EL表达式

前面的例子中我们在helloworld.jsp中使用了${}的EL表达式,例如${accountErrorString },相当于下面的代码:

<%
if(session.getAttribute("accountErrorString")!==null)
{
    Out.println(session.getAtribute("accountErrorString").toString());
}
%>

当我们在第一次请求helloworld.jsp页面的时候,因为变量值为空,所以页面上啥都不显示,但是当进入servlet程序并通过request.setAttribute赋值后,再一次返回到helloworld.jsp页面后,此时的session.getAtribute("accountErrorString")因为共享请求内容改变已经不再为空,页面渲染后就会出现“account is error”提示了。

致谢

这一口气写了好多篇入门文章了,在这里要特别感谢程架(ChenGpt)、春哥(不是那个春哥)和建华经理(看问题很犀利啊)对于一些问题的解答和讨论,希望通过细致入微的讲解,能让更多入门级的朋友少走弯路,多少能给大家带来一些帮助,那已经是极好的事情了。

参考资料:

https://blog.csdn.net/weixin_43174640/article/details/106774147

https://blog.csdn.net/qq_43356428/article/details/105384647

https://blog.csdn.net/Leesnwen/article/details/117914771

https://blog.csdn.net/qq_36957681/article/details/90712868

https://blog.csdn.net/qq_47895373/article/details/125513081

https://blog.csdn.net/m0_61160520/article/details/129740997

https://blog.csdn.net/weixin_36483050/article/details/114056889

  • 33
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛哥依旧在

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值