JavaWeb.servlet使用

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

JavaWeb.servlet使用

失格LXY   2022-06-03 我要评论

前言:

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

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

一.实现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哟~

总结

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们