版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/Mythology_px/article/details/82667796
Servlet是一个Java程序,是在服务器上运行以处理客户端请求并做出响应的程序,Servlet运行于服务端
Servlet
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 创建一个可以处理客户端请求的Servlet程序
* 该Servlet对请求作出响应,是通过Java代码来构建的
* 通过继承HttpServlet类,来实现对请求和响应的操作
*
* 如何实现Servlet的请求响应,
* 是通过配置web.xml来实现路径的约定以及具体响应的实例类
*/
public class MyServlet extends HttpServlet {
@Override
// 以post方式请求服务时调用
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应的内容格式以及字符编码
response.setContentType("text/html;charset=utf-8");
// 获取响应输出流
/*
* 字符流可以按照设置的编码输出中文,
* 字节流并不能使用编码,字节流输出需进行字节转换
* 两种流不能同时使用
*/
PrintWriter out = response.getWriter();
// 通过输出流,动态的响应页面
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println("<HEAD><TITLE>Servlet</TITLE></HEAD>");
out.println("<BODY>");
/*
* 页面内容写在<body>标签中:
* 字符输出方式有两种,print和write,
* write只能输出字符串,只能通过换行标签换行;print可以将其他格式转换为字符串
* 输出的标签可以分开写,也可以一起写
*/
out.println("<h1>");
out.println("墨渐生微");
out.println("</h1>");
out.write("<h2>欢迎关注</h2><br />");
out.println("</BODY>");
out.println("</HTML>");
// 刷新输出流
out.flush();
// 关闭输出流
out.close();
}
// 以get方式调用服务时调用
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// get方式响应时,调用doPost()方法,减少代码冗余
doPost(request, response);
}
}
Servlet的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--在web.xml配置Servlet:实现请求时的Servlet响应-->
<!--请求Servlet时响应的具体实例-->
<servlet>
<!--响应类的别名-->
<servlet-name>servlet</servlet-name>
<!--具体响应的Servlet类路径-->
<servlet-class>com.servlet.MyServlet</servlet-class>
</servlet>
<!--请求时访问的配置-->
<servlet-mapping>
<!--请求路径下响应的Servlet名-->
<servlet-name>servlet</servlet-name>
<!--请求Servlet的路径名:必须写"/",否则会出错-->
<url-pattern>/serv</url-pattern>
</servlet-mapping>
<!--servlet配置完成后是通过访问项目下的serv约定路径,再通过name的对比,找到具体响应的实例类-->
</web-app>
Servlet的生命周期
package com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* Servlet的生命周期
* MyServlet是一个普通的类,,继承了HttpServlet,可以用来处理客户端的请求以及响应
* MyServlet具有构造方法,也可以被实例化,但是一般不需要去实例化创建对象
* 将Servlet程序运行于Tomcat服务器上时,在进行第一次访问的时候,Tomcat会自动将其实例化,并进行初始化
*
* service()方法是在处理请求时会被自动调用,无论是get方式或者post方式,都会在service中处理,
* 然后由service来交给相应的doPost或doGet来处理,如果重写了service方法,就不会再处理doGet和doPost
*
* Servlet的销毁是在程序正常关闭,也就是服务器停止的时候,Servlet会销毁
*/
public class MyServlet extends HttpServlet {
// 构造方法
public MyServlet() {
System.out.println("Servlet实例化");
}
// 初始化
public void init() throws ServletException {
System.out.println("Servlet初始化");
}
// 服务
// public void service(HttpServletRequest arg0, HttpServletResponse arg1)
// throws ServletException, IOException {
// /*
// * 重写service方法,就不会调用doGet方法和doPost方法
// */
// System.out.println("Servlet服务");
// }
// get提交方式请求
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doGet处理请求");
}
// post提交方式请求
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost处理请求");
}
public void destroy() {
System.out.println("Servlet销毁");
}
}
HttpServlet类
浏览器和服务端
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>注册页面请求Servlet</title>
</head>
<body>
<form action="serv" method="post">
帐号:<input type="text" name="user" /><br /> 密码:<input type="password"
name="pwd" /><br /> <input type="submit" />
</form>
<%
/*
form表单提交的位置为Servlet配置的约定路径,通过web.xml配置Servlet使类进行响应
<!--Servlet的配置-->
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>com.service.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/serv</url-pattern>
</servlet-mapping>
*/
%>>
</body>
</html>
package com.service;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* Servlet服务器端,进行处理请求
*/
public class MyServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// get方式请求时,通过调用doPost()方法进行处理
doPost(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String user = request.getParameter("user");
String pwd = request.getParameter("pwd");
if (user.equals("Micro") && pwd.equals("mjsw")) {
// Servlet的请求转发
request.setAttribute("user", "Micro");//请求存值
request.getRequestDispatcher("/ok.jsp").forward(request, response);
} else {
// Servlet的重定向
request.setAttribute("other", "error");//请求存值
response.sendRedirect("error.jsp");
}
}
}
跳转页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>ok</title>
</head>
<body>
<h1>登陆成功,欢迎进入</h1>
<%
/*
请求转发:
一次请求,浏览器地址栏不变化,可跳转同一web项目页面,
跳转后页面与原跳转页面在同一请求中,可共享request存储空间(可以输出user对应的内容)
*/
String name=(String)request.getAttribute("user");
System.out.print(name);
%>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>error</title>
</head>
<body>
<h1>登陆失败,密码或账号不正确</h1>
<%
/*
重定向:
两次请求,地址栏发生改变,可以跳转到任意地址
跳转后页面与原跳转页面不在同一请求中,不可共享request存储空间(输出为null)
*/
String other=(String)request.getAttribute("other");
System.out.print(other);
%>
</body>
</html>
Servlet参数
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--配置Servlet上下文,包换在web-app中,所有的Servlet程序都可以访问获取该值-->
<context-param>
<param-name>all</param-name>
<param-value>have</param-value>
</context-param>
<!--配置Servlet -->
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.service.MyServlet</servlet-class>
<!--Servlet初始化参数配置:包含在单个Servlet配置中,该Servlet程序可以访问获取该值-->
<init-param>
<param-name>user</param-name>
<param-value>Micro</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/serv</url-pattern>
</servlet-mapping>
</web-app>
package com.service;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 在配置Servlet的web.xml文件时,可以相应的进行一些初始化存值
*/
public class MyServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 在get方式的请求时,访问web.xml中的初始化值以及Servlet上下文的值
// 获取初始化值
String ini_value = this.getInitParameter("user");
// 获取上下文参数
String cont_value = this.getServletContext().getInitParameter("all");
System.out.println("初始化的值:"+ini_value);
System.out.println("上下文参数:"+cont_value);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}