servlet
概述
工作原理图
工作流程
Servlet的生命周期
代码如下,ServletLifeCycle.java:
package com.edu.ServletStudy;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletLifeCycle implements Servlet {
public ServletLifeCycle() {
//构造方法被调用,创建一个实例对象
System.out.println("第一步:实例对象");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//对servlet进行初始化,只执行一次
System.out.println("第二步:初始化");
}
@Override
public ServletConfig getServletConfig() {
//返回一个ServletConfig对象用来返回初始化参数和ServletContext
return null;
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("第三步:提供服务");
//中文乱码解决
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
//响应请求的信息
HttpServletResponse res = (HttpServletResponse)response ;
res.getWriter().write("Hello Servlet,我是啊Q老师");
}
@Override
public String getServletInfo() {
//提供有关servlet的信息
return null;
}
@Override
public void destroy() {
System.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>
<!--servlet内部名称-->
<servlet-name>ServletLifeCycle</servlet-name>
<!--servlet类的全名-->
<servlet-class>com.edu.ServletStudy.ServletLifeCycle</servlet-class>
</servlet>
<!--servlet映射配置-->
<servlet-mapping>
<!--servlet的内部名称,与上面的保持一致-->
<servlet-name>ServletLifeCycle</servlet-name>
<!--servlet的映射路径(地址一般是action里面的内容,获取数据请求)-->
<url-pattern>/ServletLifeCycle</url-pattern>
</servlet-mapping>
</web-app>
运行如图:控制台
页面
当点击停止时,Servlet便会执行destroy()方法
ServletConfig对象
代码如下,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>ServletLifeCycle</servlet-name>
<servlet-class>com.edu.ServletStudy.ServletLifeCycle</servlet-class>
<!--可以用一个或多个<init-param>标签配置本Servlet的初始化参数-->
<init-param>
<!--键-->
<param-name>username</param-name>
<!--值-->
<param-value>啊Q老师</param-value>
</init-param>
<init-param>
<param-name>pwd</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletLifeCycle</servlet-name>
<url-pattern>/ServletLifeCycle</url-pattern>
</servlet-mapping>
</web-app>
ServletLifeCycle.java:
package com.edu.ServletStudy;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
public class ServletLifeCycle implements Servlet {
@Override
//当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init( )方式传入一个 ServletConfig对象
public void init(ServletConfig servletConfig) throws ServletException {
//获取配置servlet所有初始化参数的键
Enumeration<String> enumeration = servletConfig.getInitParameterNames();
//遍历输出键与值
while (enumeration.hasMoreElements()){
String names = (String)enumeration.nextElement();
String values = servletConfig.getInitParameter(names); //获取servlet配置的初始化参数
System.out.println("ParamName = " + names + "ParamValue = " + values);
}
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {}
}
控制台如图:
ServletContext对象
代码如下,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的初始化参数-->
<context-param>
<param-name>username</param-name>
<param-value>啊Q老师</param-value>
</context-param>
<context-param>
<param-name>pwd</param-name>
<param-value>123</param-value>
</context-param>
<servlet>
<servlet-name>ServletConextTest</servlet-name>
<servlet-class>com.edu.ServletStudy.ServletConextTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletConextTest</servlet-name>
<url-pattern>/ServletConextTest</url-pattern>
</servlet-mapping>
</web-app>
ServletConextTest.java:
package com.edu.ServletStudy;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
public class ServletConextTest implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
//访问ServletContext
ServletContext context = servletConfig.getServletContext();
//获取配置servlet所有初始化参数的键
Enumeration<String> paramNames = context.getInitParameterNames();
//遍历输出键与值
while (paramNames.hasMoreElements()) {
String name = paramNames.nextElement();
String value = context.getInitParameter(name);
System.out.println(name + " = " + value);
}
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}
public String getServletInfo() {
return null;
}
public void destroy() { }
}
HttpServlet
Servlet的实现
接下来,我们进一步对Servlet的实现,获取Register.html页面表单提交的参数。
在web文件目录下创建Register.html,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Servlet学习</title>
<link rel="stylesheet" type="text/css" href="CSS/Register.css">
</head>
<body>
<form action="http://localhost:8080/MSW/Register" method="post">
<h1>Welcome</h1>
<label>账号:</label>
<input type="text" name="username"/><br>
<label>密码:</label>
<input type="password" name="pwd"/><br>
<label>性别:</label>
<input type="radio" name="sex" value="男"/>男
<input type="radio" name="sex" value="女"/>女<br>
<label>生日:</label>
<select name="birthday">
<optgroup label="请选择年份">请选择年份</optgroup>
<option value="2000">2000</option>
<option value="2001">2001</option>
<option value="2002">2002</option>
</select><br>
<input type="submit" value="注 册">
<input type="reset" value="重 置">
</form>
</body>
</html>
在web/CSS目录下创建Register.css,代码如下:
body{
text-align:center;
background-color: antiquewhite;
}
在src创建com.edu.ServletStudy包,再创建RegisterServlet.java,代码如下:
package com.edu.ServletStudy;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RegisterServlet extends HttpServlet {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决响应结果中文显示乱码
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
//数据获取
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
String sex = request.getParameter("sex");
String birthdayStr = request.getParameter("birthday"); //获取字符串类型的数据
Integer birthday = Integer.parseInt(birthdayStr); //字符串转整型
//控制台上打印
System.out.println("username = " + username);
System.out.println("pwd = " + pwd);
System.out.println("sex = " + sex);
System.out.println("birthday = " + birthday);
//跳转在新网页上打印
response.getWriter().println(request.getParameter("username"));
response.getWriter().println(request.getParameter("pwd"));
response.getWriter().println(request.getParameter("sex"));
response.getWriter().println(Integer.parseInt(birthdayStr));
}
}
在web/WEB-INF目录下的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">
<!--
首先,用户发起请求,action=Register;
然后Tomcat中的web.xml先寻找url-pattern = /Register,到servlet-mapping中的servlet-name = RegisterServlet;
再到servlet寻找对应servlet-mapping的servlet-name的servlet;
再找到servlet-class的com.edu.ServletStudy.RegisterServlet;
最后由于用户发送的是post请求(method = post),所以Tomcat执行doPost方法。
-->
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>com.edu.ServletStudy.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/Register</url-pattern>
</servlet-mapping>
</web-app>
在RegisterServlet.java点击运行,效果如图:
控制台结果:
网页结果:
实现过程遇到的问题解决
解决Address localhost:1099 is already in use的问题
如图:
解决Servlet获取radio的值为on的问题
如图:
导致这个问题的主要原因可能是代码有错误的地方,无法识别获取到值。
正确的代码:
<input type="radio" name="sex" value="男"/>男
<input type="radio" name="sex" value="女"/>女<br>
IDEA中的clean工程
clean功能清除项目中缓存重新加载校验。
步骤如图:
1.点击File—>Invalidate Caches / Restart…
2.点击Invalidate and Restart,缓存将在下一次启动时失效并重新构建,当地历史也将被清除。
3.IDEA重启