创建一个名为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包导进来
这样就可以创建servlet啦
不过我发现不仅可以这样创建,
还可以这么创建(但是好像要在里面写些东西才可以):
第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>
地址栏加上/regist.html,运行一下
小知识点:
webapps:tomcat默认部署路径
wtpwebapps:myeclipse默认部署路径
小知识点:
war exploded模式是将WEB工程以当前文件夹的位置关系上传到服务器,即直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。
随意输入一个账号,回车
*小问题:*运行出现500错误,查了一下,出现这种问题,是没有将jar文件放到WEB-INF的lib目录下
再进一步发现自己没有在WEB-INF下创建classes和lib,classes用来存放out文件(等等用得上),lib用来存放依赖包
当创建时又出现了问题,原本应该时Directory是地方变成了Package,又查了一下,下图这么做就可以整回来啦
intellij idea里Mark Directory As Excluded的含义:
排除掉当前文件夹,如果文件夹是source文件夹,排除了,就变成普通文件夹,不再认为是source,就不会编译当前文件夹内部的java到classpath里
将文件标记为Excluded目录后,idea就不会为该文件创建索引,全局搜索也不会搜里面的内容,编辑代码不会智能提示,Excluded Folders相当于代码废弃场
将jar文件放到WEB-INF的lib目录下:
可是问题还没有解决,再寻找问题,发现是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);
}
*小知识点:*开发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中
在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);
}
}
<!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>
重定向举例:
比如在LoginServlet.java里添加
变成这样:response.sendRedirect("index.jsp?money=100000&gift=maotai,zhonghua");
浏览器的地址栏就会有这些东西