对于企业版,直接创建
Java Enterprise
即可对于社区版,需要创建
Maven
项目之后,手动配置Java Enterprise原始目录
默认后,直接下一步即可
我们发现其实默认就会带上Servlet包
创建完成后,会得到以下目录
项目创建完成后,在webapp
目录下创建login.jsp
点击刚才创建的jsp文件,我们会得到原始的jsp文件
修改title
title将会是显示在页面头部的信息
修改成登录
在body中添加信息
在body中随便添加一点信息,方便后续查看页面是否配置成功
打开webapp
->web.xml
文件
输入以下内容
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
出现下列页面则配置成功
在login.jsp中完成基础表单填写
显示出页面
当前是无法进行对登录进行响应的,需要创建对应的servlet响应请求
首先,对login.jsp
文件继续改写
使其完成对请求的发送
<form action="login" method="post">
<label>
用户名:
<input name="userName" />
</label>
<br />
<label>
密   码:
<input name="passWord" />
</label>
</form>
这里注意的是:
action
不要加上/
,会被解析成跳转至指定的路径
添加注解
继承HttpServlet
重写doGet
重写doPost
为什么自定义LoginServlet只要重写doGet和doPost方法?
两个方法如果不被重写,那么就会默认调用HttpServlet中的代码。
我们来看HttpServlet源码中
doGet
和doPost
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_get_not_supported"); if (protocol.endsWith("1.1")) { resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg); } else { resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg); } } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_post_not_supported"); if (protocol.endsWith("1.1")) { resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg); } else { resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg); } }
获取协议
获取国际化字符串
判断协议
HTTP/1.1
- 是——返回405
- 不是——返回400
这样就无法对post请求和get请求进行响应了
继承HttpServlet,重写方法
继承HttpServlet后,按住键盘ctrl
+o
选择重写方法——doGet 和 doPost
修改doGet请求
因为get会以明文的形式显示在URL上,所以选择在doPost中写相关逻辑代码
在doGet中直接调用doPost方法即可
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req , resp);
}
创建doPost请求
首先获取用户名和密码这两个参数,然后对账号密码进行判断
- 成功——重定向至index.jsp
- 失败——转发至当前页面
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName = req.getParameter("userName");
String passWord = req.getParameter("passWord");
if(canLogin(userName , passWord)){
resp.sendRedirect("index.jsp");
}else{
req.getRequestDispatcher("login.jsp").forward(req , resp );
}
}
private boolean canLogin(String userName , String passWord){
if("Leo".equals(userName)){
if("1".equals(passWord)){
return true;
}
}
return false;
}
为什么登陆成功需要
sendRedirect
,而登陆失败要forward
?转发有一个特点——浏览器地址不会发生改变
也就是说,在servlet进行请求转发时,按下F5进行刷新,就会重复发起一起请求,造成表单的重复提交
因此,在表单提交的地方,不能使用转发作为跳转页面的方式
我们做一个实验就知道了
这里,我在登陆的那一刻,按下了刷新,出现了两次表单验证
而在登陆成功后使用
redirect
则不会出现以上情况
添加注解
在完成后,在类的最上方添加注解@WebServlet
——与登录form的action对应
@WebServlet("/login")
本阶段代码
package com.example.Login;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req , resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName = req.getParameter("userName");
String passWord = req.getParameter("passWord");
if(canLogin(userName , passWord)){
resp.sendRedirect("index.jsp");
}else{
req.getRequestDispatcher("login.jsp").forward(req , resp );
}
}
private boolean canLogin(String userName , String passWord){
if("Leo".equals(userName)){
if("1".equals(passWord)){
return true;
}
}
return false;
}
}