前面一篇不直接写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