JavaWeb.servlet基本使用

前言:我们在前几篇文章里的web项目都是用jsp文件完成的,那么什么时候jsp算是学完了呢?——在jsp文件中没有java代码。

在原来的doxxx.jsp文件里写的都是处理登陆或者主页面功能的java代码,现在我们需要servlet来代替doxxx.jsp文件。

目录

一.实现servlet

二.开发模式 

三.继承Servlet 


一.实现servlet

我们可以一个登陆来当例子。

建一个com.xxx.servlet包,在写一个LoginServlet类

package com.zking.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 
 * @author zjjt
 *用来实现登陆请求的处理
 */
public class LoginServlet implements Servlet{

	//生命周期
	
	@Override//初始化
	public void init(ServletConfig arg0) throws ServletException {
		//当请求来到这个servlet就会调用init方法
		System.out.println("开始初始化");
	}
	
	@Override//服务
	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
		// 所有的代码写在这个方法中
		//强转响应
		HttpServletResponse response = (HttpServletResponse) resp;
		//强转请求
		HttpServletRequest request = (HttpServletRequest) req;
		//如果用户名是中文
		req.setCharacterEncoding("utf-8");
		//取到用户数据
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		//通过响应对象获得输出对象
		PrintWriter out = response.getWriter();
	    //通过请求对象取session,需要强转请求
		HttpSession session = request.getSession();
		//取application通过请求对象
		ServletContext application = request.getServletContext();
		//与数据库数据做对比
		if("root".equals(username)&&"root123".equals(password)) {
			//登陆成功
			//转发:req.getRequestDispatcher("/xx").forward(req, resp);
	        //重定向:需要强转响应
			//response.sendRedirect("/xx");
			out.println("登陆成功");
		}else {
			//登陆失败
			out.println("登陆失败");
		}
	}
	
	@Override//销毁
	public void destroy() {
		//什么时候销毁
		//1.服务关闭时
		//2.这个类被修改时
		System.out.println("我销毁了");
	}
	
	@Override//得到配置
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override//得到信息
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}


}

 家人们注意了在代码里我使用了强转,是因为ServletRequest 和 ServletResponse 没有重定向功能,所有request(请求)和response(响应)取不到值。但是ServletRequest 和 ServletResponse的子类有重定向功能所有,我们要进行强转。

提供访问路径【web.xml】

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>Web20</display-name>
  <!-- web.xml是整个项目的配置文件  -->
  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>
  <!-- 1.配置servlet -->
  <servlet>
    <!-- 给取个名字 -->
    <servlet-name>one</servlet-name>
    <!-- servlet-class需要填上类的全路径 -->
    <servlet-class>com.zking.servlet.LoginServlet</servlet-class>
  </servlet>
  <!-- 2.配置servlet的访问路径 -->
  <!-- mapping 映射 -->
  <servlet-mapping>
     <!-- 对应的servlet的名字 -->
     <servlet-name>one</servlet-name>
     <!-- 给它配置一个访问路径 -->
     <url-pattern>/login.do</url-pattern>
  </servlet-mapping>
</web-app>

切记修改了web.xml的代码一定要重启服务器 

访问路径一定要加/,否则运行会报错

 登陆界面代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- action里填配置的路径不需要加/ -->
<form action="login.do" method="post">
    <p><input type="text" name="username"></p>
    <p><input type="text" name="password"></p>
    <p><button>登陆</button></p>
</form>
</body>
</html>

 这样我们的登陆就完成了,但是这样大家会不会觉得代码有点多,没关系,还有其他方法。

二.开发模式 

我们的开发模式有两种,一种是(传统的开发模式)配置式开发,另一种是注解式开发。我们上面所讲的就是配置式开发,接下来我们来讲一讲注解式开发~( ̄▽ ̄)~*。

注解式开发使用的是@注解,在代码中@WebServlet就等于web.xml里的

 在@WebServlet后面加上(),在里面直接填入路径,例如@WebServlet("/xxx")就等于web.xml里的

三.继承Servlet 

 使用注解式开发的方法我们就可以不用修改web.xml代码了,是不是简单多了(●'◡'●)。接下来我们写一个MyServlet文件,写Servlet有两种方法,一种式实现,另一种是继承。实现的方法我们已经写过了,接下来我们使用继承的方法

package com.zking.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;


/**
 * 
 * @author zjjt
 *
 */
@WebServlet("/test.do")//直接填访问路径
public class MyServlet extends HttpServlet{
	
	//不同的请求方式:
	//doGet 专门处理get请求
	//doPost 专门处理post请求
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//登陆功能
		doPost(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//登陆功能
		//如果用户名是中文
		req.setCharacterEncoding("utf-8");
		//取到用户数据
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		//支持中文的编码【utf-8】【gb2312】【big5】
		req.setCharacterEncoding("gb2312");
		//通过响应对象获得输出对象
		PrintWriter out = resp.getWriter();
	    //通过请求对象取session,需要强转请求
		HttpSession session = req.getSession();
		//取application通过请求对象
		ServletContext application = req.getServletContext();
		//与数据库数据做对比
		if("root".equals(username)&&"root123".equals(password)) {
			//登陆成功
			//转发:req.getRequestDispatcher("/xx").forward(req, resp);
	        //重定向:需要强转响应
			//response.sendRedirect("/xx");
			out.println("登陆成功");
		}else {
			//登陆失败
			out.println("登陆失败");
		}
	}
	
	
}

 家人们有发现实现和继承servlet有什么区别了吗

 我相信细心的家人们应该已经发现了我这里继承的是HttpServlet而不是Servlet。这是因为HttpServlet是它的子类,具有重定向功能,这下我们又可以省去强转的部分了。所有我推荐大家使用注解式开发模式和继承Servlet的方式来写Servlet哟~

到这里就结束了

 


文章标签:

原文连接:https://blog.csdn.net/weixin_64938628/article/details/124402611

相关推荐

2022 年最新 Java 后端薪资统计出炉,看看你有没有拖后腿

java中的线程如何理解——精简

Excel解析

Java中的IO流如何理解——精简

【刷题记录①】Java从0到1入门|基础知识巩固练习

你见过哪些实用到爆的 Java 代码技巧?

Java中Map集合如何理解(四)——精简

嵌入式 Linux 内核驱动开发【The first day: 36093万字】

本周涨粉一倍,我决定再开源一个商超管理系统

Mac上解决dose not contain the JNI_CreateJavaVM symbol

【Java代码笔记】

Java-“equals“ 与 “==“详解

Java关键字(六):instanceof

Java,自从看了你一眼,就再也无法忘怀

令人回味无穷的Java故事

Java中的set集合如何理解——精简

超简单,自己动手写一个二维码生成器

Java-包装类(Wrapper)的使用(一篇讲透)

Java关键字(五):final

Java中的LIst集合如何理解(二)——精简