8、servlet

servlet
  1. servlet:一个servlet就是一个小java程序,servlets运行在web服务器(Tomcat),servlets接收和响应来自客户端的请求。

作用:

  • 接收请求
  • 处理请求
  • 完成响应
  1. servlet示例代码
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//一个servlet只能处理一个指定的请求
//应该指定servlet处理哪个请求
//需要在web.xml配置信息
public class MyFirstServlet implements Servlet {
	//初始化
	@Override
	public void init(ServletConfig config) throws ServletException {}
	//获取servlet配置信息
	@Override
	public ServletConfig getServletConfig() {
		return null;
	}
	//服务
	@Override
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		//service方法是用来处理客户端的请求
		System.out.println("我是第一个Servlet");
		//ServletResponse res 给浏览器发送一个响应
		//获取一个写数据的对象
		PrintWriter write=res.getWriter();
		write.write("HelloWorld!");
	}
	//获取servlet信息
	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}
	//销毁
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}
}
  1. web.xml代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>FirstWeb</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 <!-- 配置servlet标签配置servlet的类信息,告诉服务器我有这个servlet -->
  <servlet>
    <description></description>
    <display-name>MyFirstServlet</display-name>
   	<!-- 配置servlet的名字,相当于给servlet取别名,给程序员看的-->
    <servlet-name>MyFirstServlet</servlet-name>
    <!-- 配置servlet类的全名,给服务器看,以便于通过全类名找到该类 -->
    <servlet-class>com.aiguigu.servlet.MyFirstServlet</servlet-class>
  </servlet>
  <!-- servlet映射信息,也就是servlet用来处理哪个请求-->
  <servlet-mapping>
    <!-- 刚才servlet的别名 -->
    <servlet-name>MyFirstServlet</servlet-name>
    <!-- 告诉服务器这个servlet用来处理哪个请求 http://localhost:8080/FirstWeb/helloWorld-->
    <url-pattern>/helloWorld</url-pattern>
  </servlet-mapping>
</web-app>
  1. servlet流程
  • 创建自己的类来实现servlet接口
  • 在servlet方法里面写代码
  • 在web.xml配置
  • 用户在浏览器地址栏输入http://localhost:8080/FirstWeb/helloWorld,是否有静态资源对应,没有对应的静态资源,所以服务器就去找动态资源,即在web.xml中的servlet-mapping中找(但一般先找动态资源再找静态资源)

在这里插入图片描述

  1. servlet生命周期
  • 创建一个servlet对象
  • 调用Init方法,初始化servlet
  • 调用service方法,以后请求只调用service方法,整个运行期间只创建了一个servlet对象,servlet是单实例,多线程运行,在servlet里为了线程安全不定义共享变量
  • 当项目从服务器上卸载,服务器会调用destroy方法,销毁servlet方法,做善后工作
  1. servletConfig
  • web.xml
  <servlet>
   	<!-- 配置servlet的名字,相当于给servlet取别名-->
    <servlet-name>MyFirstServlet</servlet-name>
    <!-- 配置servlet类的全名 -->
    <servlet-class>com.aiguigu.servlet.MyFirstServlet</servlet-class>
    <init-param>
    	<param-name>username</param-name>
    	<param-value>zhoucanlong</param-value>
    </init-param>
  </servlet
  • java
	//初始化
	@Override
	public void init(ServletConfig config) throws ServletException {
		//ServletConfig是封装了servlet配置信息的对象
		//一个servlet对应一个ServletConfig,封装的是当前的servlet的配置信息
		this.config=config;
		//1.getServletName()获取配置的servlet别名
		String servletName=config.getServletName();
		System.out.println(servletName);
		//2.获取servlet初始化参数
		String username=config.getInitParameter("username");
		System.out.println(username);
		//3.获取ServletContext对象,代表当前servlet的上下文,代表当前的web项目信息
		ServletContext context=config.getServletContext();
		System.out.println(context);
	}
  1. ServletContext
  • web.xml
	<!-- 配置web初始化的参数 -->
	<context-param>
		<param-name>user</param-name>
		<param-value>root</param-value>
	</context-param>
  <servlet>
  	<servlet-name>ContextServlet</servlet-name>
  	<servlet-class>com.aiguigu.servlet.ContextServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>ContextServlet</servlet-name>
  	<url-pattern>/ContextServlet</url-pattern>
  </servlet-mapping>
  • java
@Override
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		//获取到的ServletConfig获取ServletContext
		ServletConfig servletConfig=this.getServletConfig();
		ServletContext servletContext=servletConfig.getServletContext();
		//1.一个web应用对应一个servletContext
		//2.功能
		//  1)获取web项目初始化信息
		String user=servletContext.getInitParameter("user");
		System.out.println(user);
		
		//  2)获取web项目的路径
		String path=servletContext.getContextPath();
		System.out.println(path);
		
		//  3)获取资源的真实路径
		//  虚拟路径:网络访问使用虚拟路径,每一个虚拟路径应该对应一个实际的资源,
		//  动态资源(文件的形式)、动态资源(只是启动一段代码)
		//  真实路径:文件在磁盘中的存储路径
		String readPath=servletContext.getRealPath("/index.html");
		System.out.println(readPath);
		
		//   4)可以作为最大域对象共享数据,四大域对象 application
	}
  1. HttpServlet
//HttpServlet是专门用来处理http请求的servlet
public class MyEclipseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public MyEclipseServlet() {
        super();
        System.out.println("我是构造器");
    }
	//我们发现每次请求调用doGet方法
	//经常有get请求和post请求
    //post请求目前只有一种,表单提交的时候指定method="post"
    //get请求,回车,超链接,img src="";
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("我是doGet");
		//正常不区分请求方式
		doPost(request,response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//写业务
		System.out.println("我是doPost");
	}
}
  1. HttpServletResponse
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//HttpServletRequest request  代表就是封装浏览器请求信息的对象,收到浏览器端的请求
		//HttpServletResponse response 代表就是要发送浏览器的响应对象,封装响应信息
		//1.可以给浏览器响应字符串
		PrintWriter writer=response.getWriter();
		writer.write("HelloWorld");
		//2.可以重定向到一个页面或者其他资源,重定向就是服务器告诉浏览器请求别的资源
		//已经对request响应完成
		response.sendRedirect("success.html");
	}
  1. HttpServletRequest
  • java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //http请求:  请求首行 请求头 空行 请求体(封装的请求数据-post)
		//get请求将所有携带的参数放在url
		//1.获取请求数据 get放在url后面 post放在请求体里
		String username=request.getParameter("username");
		System.out.println(username);
		//结果只提交一个结果
		//String aihao=request.getParameter("aihao");
		//使用getParameterValues()获取多选框的内容
		String[] aihao=request.getParameterValues("aihao");
		if(aihao!=null){
			for(String str:aihao){
				System.out.println(str);
			}
		}
		System.out.println(aihao);
		//2.获取请求头信息
		//userAgent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.2; Win64; x64; Trident/7.0; LCTE)
		String userAgent=request.getHeader("User-Agent");
		System.out.println(userAgent);
		//3.转发一个页面/资源
		//先获取一个请求转发器
		RequestDispatcher dispatcher=request.getRequestDispatcher("success.html");
		//将请求转发出去
		dispatcher.forward(request, response);
	}	
  • html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>helloWorld</h1>
<a href="http://localhost:8080/FirstWeb/MyEclipseServlet">链接</a>
<form action="MyEclipseServlet" method="post">
	用户名:<input type="text" name="username"/>
	<input type="submit"/>
</form>
<form action="MyEclipseServlet" method="get">
	用户名:<input type="text" name="username"/>
	<input type="submit"/>
	爱好:<br/>篮球<input type="checkbox" name="aihao" value="lanqiu"/>
	<br/>足球<input type="checkbox" name="aihao" value="zuqiu"/>
	<br/>乒乓球<input type="checkbox" name="aihao" value="pingpanqiu"/>
</form>
</body>
</html>
  1. 转发和重定向
  • 转发和重定向的区别

在这里插入图片描述

  • java代码
		//获取请求头信息
		String header = request.getHeader("User-Agent");
		System.out.println(header);
		//1.重定向到页面,就是告诉浏览器重新请求一个资源
		//重定向路径:http://localhost:8080/FirstWeb/success.html
		//虚拟路径:http://localhost:8080/FirstWeb/MyServlet2
		//
		response.sendRedirect("success.html");
		//2.转发到页面
		//转发:服务器处理完成以后,转交到另外一个资源,当我们转发的资源是一个页面资源或静态资源,服务器会给浏览器返回这个资源
		//当转交给servlet时候,servlet可以继续处理,
		//request.getRequestDispatcher("success.html").forward(request,response);
		//3.转发和重定向的区别
		
  • 请求转发

在这里插入图片描述

  • 响应重定向

在这里插入图片描述

  1. 登录练习
  • 登录

1)访问登录界面

2)填写用户密码后提交表单

3)服务器判断用户是否存在

4)如果登录失败-》返回用户名或者密码错误

​ 如果登录成功-》登录成功

  • 注册

1)访问注册页面

2)填写注册信息,提交给服务器

3)服务器应该保存用户

4)当用户已经存在-》返回注册失败

​ 当用户注册成功-》

  • 代码
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取用户信息
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		String repwd=request.getParameter("repwd");
		String email=request.getParameter("email");
		//判断用户是否可以注册,只要用户名不是admin就让注册
		if(!"admin".equals(username)){
			request.getRequestDispatcher("RegistSuccess.html").forward(request, response);
		}else{
			request.getRequestDispatcher("RegistFail.html").forward(request, response);
		}
	}
  1. 响应乱码

响应后出现了如下情况
在这里插入图片描述

	//告诉浏览器传输的数据的内容类型
	//第一种方法
	//response.setContentType("text/html");
	//告诉浏览器编码
	//response.setCharacterEncoding("UTF-8");
	//第二种方法
	//response.addHeader("Content-type", "text/html;charset=UTF-8");
	//第三种方法
	response.setContentType("text/html;charset=UTF-8");
	//获取流
	PrintWriter writer=response.getWriter();
	writer.write("你好世界");
	//解决字符乱码存在以下地方
	//1)响应给浏览器的数据是乱码,
	//   原因:是浏览器不知道数据的类型及编码格式
	//   解决:告诉浏览器内容类型及编码格式,在响应头里Content-type:text/html;charset=UTF-8
	//   方法:如上的三种
	
	//当我们在表单中获取的也是乱码
	//1.post乱码的原因
	//浏览器将数据编码并提交上来,但是服务器不知道编码规则
	//解决方法:让服务器知道编码规则即可,重新设置请求的编码格式
	request.setCharacterEncoding("UTF-8");
	String username=request.getParameter("username");
	System.out.println(username);
	//2.get乱码的原因
	//原因:浏览器将地址栏编码了,服务器不知道,而且8080端口接收到url以后,已经按照默认的解码方法解码
	//所以request.setCharacterEncoding("UTF-8");方法没用
	//解决方法:修改tomcat的server.xml配置文件,在8080端口出添加URIEncoding="utf-8"

在这里插入图片描述

  1. 项目路径问题
  • 绝对路径以/开始,所有在页面上的绝对路径,/都代表从服务器的根开始 http://localhost:8080 ,所以在页面写绝对路径需要加上项目名

  • 在servlet中请求转发也可以用绝对路径来写/,是以WebContent作为根的,请求转发到其他页面只需要相对WebContent来写

  • 在servlet中响应重定向也可以用绝对路径来写,是以服务器为根的,需要加上项目名。

  • 		//动态获取项目的根目录,项目路径
    		ServletContext context=getServletContext();
    		String path=context.getContextPath();
  • 导入项目,如果出现项目重复无法导入,需要在项目的.project文件中修改项目名

  1. base标签
  • 使用base标签,作用就是指定页面上所有的路径的基础路径,所有的相对路径都是以我指定的基础路径开始,只有相对路径的写法,会按照base标签指定的基础路径来拼接新的路径,指定所有相对路径的起始路径,以后的相对路径参考的都是base标签指定的路径,而不是当前资源。

  • <base href="http://localhost:8080/LoginAndRegister"/>
  1. 类加载器加载资源
  • 先导入mysql的jar包
  • jdbc.properties(mysql8.0.11跟以往有些差别)
user=root
password=123456
jdbcDriver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=FALSE&serverTimezone=UTC

  • jdbc.properties需要放到src目录下,否则会出现找不到该文件的问题,或者在项目根目录下新建一个config文件夹,放在下面
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtils {
	public static Properties properties=new Properties();
	static{
		try {
			//properties.load(new FileInputStream(new File("jdbc.properties")));
			//Class.forName("com.mysql.cj.jdbc.Driver");
			//类加载器获取资源,会在类路径下找(WEB-INF/classes)
			ClassLoader loader=JDBCUtils.class.getClassLoader();
			InputStream stream=loader.getResourceAsStream("jdbc.properties");
			properties.load(stream);
			Class.forName(properties.getProperty("jdbcDriver"));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static Connection getConnection() throws SQLException {
		Connection connection=null;
		connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=FALSE&serverTimezone=UTC","root","123456");
		return connection;
	}
}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Connection connection=null;
		try {
			connection=JDBCUtils.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}		
		System.out.println(connection);
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("登录成功");
	}

",“root”,“123456”);

  return connection;

}
}


```java
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Connection connection=null;
		try {
			connection=JDBCUtils.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}		
		System.out.println(connection);
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("登录成功");
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值