文章目录
Servlet
通过本篇博客,您将会学到如下知识:用idea搭建一个简易的Servlet、表单数据(get,post)
IDEA搭建一个简易Servlet
创建项目
然后随便命名
项目配置
- 在WEB-INF目录下新建两个文件夹classes和lib
- classes:用于存放编译后的class文件
- lib用于存放依赖的jar包
- 进入Project Structure页面按照下图进行配置,将编译后的class文件放到指定位置
- 点击 Modules –> 选中项目“JavaWeb” –> 切换到 Dependencies 选项卡 –> 点击右边的“+”,选择 “JARs or directories…”,选择创建的lib目录
编写servlet程序
-
在src中创建一个Servlet程序
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; import java.io.PrintWriter; /** * Created with IntelliJ IDEA * Description: * Author: sun mingzhi * Date: 2019/10/29 14:08 * Company: Inspur */ @WebServlet(name = "demo") public class demo extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置网页响应类型 response.setContentType("text/html"); PrintWriter out =response.getWriter(); out.println("成功啊"); } }
-
修改web.xml中的配置信息
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>demo</servlet-name> <servlet-class>demo</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo</servlet-name> <url-pattern>/demo</url-pattern> </servlet-mapping> </web-app>
配置tomcat
运行程序
表单数据
Get方法
- 向页面请求发送已编码的用户信息。页面和已编码的信息中间用?字符隔开
http://www.test.com/hello?key1=value1&key2=value2
- 是默认从浏览器向Web服务器传递信息的方法,它会产生一个很长的字符串,出现在浏览器的地址栏中,还有大小限制
- 使用doGet()方法来处理这种类型的请求
POST方法
- 使用doPost()来处理这种请求
使用Servlet读取表单数据
- **getParameter():**您可以调用 request.getParameter() 方法来获取表单参数的值。
- **getParameterValues():**如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
- **getParameterNames():**如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。
使用URL的GET方法实例
- URl:
- 其中/web是由tomcat来指定的
- /demo是由xml配置的或者在Servlet中有@WebServlet配置的。优先使用xml中的
- ?后面就是传输的数据
http://localhost:8080/web/Demo?name=冢狐&url=https://blog.csdn.net/issunmingzhi
输入这个路径发生了什么
- 发现Tomcat中的web.xml有配置这个映射路径 /Demo
- 查看映射路径的名字是什么 Demo
- 通过映射路径的名字找到配置Servelt的名字 Demo
- 通过Servlet的名字找到Servlet编译后class文件存放的位置 Demo
- 执行Demo
- Servlet代码
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;
import java.io.PrintWriter;
/**
* Created with IntelliJ IDEA
* Description:
* Author: sun mingzhi
* Date: 2019/11/13 9:47
* Company: Inspur
*/
@WebServlet("/Demo")
public class Demo extends HttpServlet {
public Demo(){
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
//处理中文乱码,设置消息头
response.setContentType("text/html;charset=UTF-8");
String name=request.getParameter("name");
String url=request.getParameter("url");
PrintWriter out=response.getWriter();
out.println(name+url);
}
@Override
protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
doGet(request,response);
}
}
- xml代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>Demo</servlet-name>
<servlet-class>Demo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo</servlet-name>
<url-pattern>/Demo</url-pattern>
</servlet-mapping>
</web-app>
-
xml注册一个Servlet组件节点
- servlet
- Servlet名称,当前xml中唯一
- Servlet实现类的全限定类名
- servlet-mapping 给注册的servlet添加映射路径
- 这个要与 前面写的servlet保持一致
- 配置这个组件的访问路径必须以/开头
- servlet
-
xml中的load-on-startup:
如果其值大于等于0:表示容器在应用启动时就加载这个Servlet
当时一个负数或者没有指定时:则指示容器在该servlet被选择时才加载
配置后,servlet在startup后立即加载,但只是调用servlet的init()方法,用以初始化该servlet相关的资源。初始化成功后,该servlet可响应web请求;如未配置load-on-startup,容器一般在第一次响应web请求时,会先检测该servlet是否初始化,如未初始化,则调用servlet的init()先初始化,初始化成功后,再响应请求。
- 正数越小,优先级越高
- 好处
- 如果初始化失败,则容器会提示启动失败,此时我们能够提前知道相关错误
- 配置该参数相当于将初始化servlet的工作转移到容器启动过程,使得容器只要启动成功后,就可以立即响应web请求
-
使用@WebServlet注解
- 不要在web.xml文件的根元素()中指定metadata-complete=“true”;默认为metadata-complete="true"的话修改其属性为metadata-complete="false"IDEA默认Web.xml配置文件没有对metadata-complete属性进行设置,此时不需要进行设置即可使用。
- 不要再xml中配置该Servlet
注意几点:
- 一个Servlet可以配置多个映射路径
- 配置多个servlet-mapping
- 出现多个url-pattern
- *可以匹配任意字符路径,在点击计数器那一章中有具体应用
- 通配符的使用格式是固定的
- 如果路径要匹配后缀名,路径必须以*开头
- 如果一个路径是以"/“开头,那么”*"必须在最后
- 注意"/"优先级高于*开头的路径
效果
使用表单的get方法实例
- HTML页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>冢狐</title>
</head>
<body>
<form action="Demo" method="GET">
网址名:<input type="text" name="name">
<br />
网址:<input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>
action:表示往哪个页面去跳转
method:表示提交数据的方式
点击提交即可跳转的响应的页面
使用表单的POST方法实例
和使用表单的get方法差不多
将复选框数据传递到Servlet
- HTML
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>冢狐</title>
</head>
<body>
<form action="demo" method="POST" target="_blank">
<input type="checkbox" name="zhonghu" checked="checked" /> 冢狐
<input type="checkbox" name="google" /> Google
<input type="checkbox" name="taobao" checked="checked" /> 淘宝
<input type="submit" value="选择站点" />
</form>
</body>
</html>
check="checked"默认勾选
- Servlet
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;
import java.io.PrintWriter;
/**
* Created with IntelliJ IDEA
* Description:
* Author: sun mingzhi
* Date: 2019/10/29 14:08
* Company: Inspur
*/
@WebServlet("/demo")
public class demo extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "读取复选框数据";
String docType = "<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>冢狐标识:</b>: "
+ request.getParameter("zhonghu") + "\n" +
" <li><b>Google 标识:</b>: "
+ request.getParameter("google") + "\n" +
" <li><b>淘宝标识:</b>: "
+ request.getParameter("taobao") + "\n" +
"</ul>\n" +
"</body></html>");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
效果图:
读取所有的表单参数
- 使用 HttpServletRequest 的 getParameterNames() 方法读取所有可用的表单参数。该方法返回一个枚举,其中包含未指定顺序的参数名。
- 一旦我们有一个枚举,我们可以以标准方式循环枚举,使用 hasMoreElements() 方法来确定何时停止,使用 nextElement() 方法来获取每个参数的名称
xml:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>冢狐</title>
</head>
<body>
<form action="demo" method="POST" target="_blank">
<input type="checkbox" name="maths" checked="checked" /> 数学
<input type="checkbox" name="physics" /> 物理
<input type="checkbox" name="chemistry" checked="checked" /> 化学
<input type="submit" value="选择学科" />
</form>
</body>
</html>
servlet
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;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* Created with IntelliJ IDEA
* Description:
* Author: sun mingzhi
* Date: 2019/10/29 14:08
* Company: Inspur
*/
@WebServlet("/demo")
public class demo extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public demo() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "读取所有的表单数据";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<table width=\"100%\" border=\"1\" align=\"center\">\n" +
"<tr bgcolor=\"#949494\">\n" +
"<th>参数名称</th><th>参数值</th>\n"+
"</tr>\n");
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String[] paramValues =
request.getParameterValues(paramName);
// 读取单个值的数据
if (paramValues.length == 1) {
String paramValue = paramValues[0];
if (paramValue.length() == 0)
out.println("<td><i>没有值</i></td>");
else
out.println("<td>" + paramValue + "</td>");
} else {
// 读取多个值的数据
out.println("<td><ul>");
for(int i=0; i < paramValues.length; i++) {
out.println("<li>" + paramValues[i]);
}
out.println("</ul></td>");
}
out.print("</tr>");
}
out.println("\n</table>\n</body></html>");
}
/**
* @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);
}
}
效果图