第五章 Servlet

版权声明:本文为博主原创文章,未经博主允许不得转载 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);
	}

}

猜你喜欢

转载自blog.csdn.net/Mythology_px/article/details/82667796
今日推荐