Servlet入门笔记和代码

第一个Servlet

首先先创建一个Web项目,然后创建一个名叫LoginServlet.java类,必须创建包,这是抒写规范。

LonginServlet.java中注解:

如果一个类继承了HttpServlet,这类就是Servlet类  HttpServlet类中有大量的方法
右键——Source——Override/Implement Methods——选择doGet()和doPost()方法,doGet()负责处理得到请求,doPost()负责
需要为LoginServlet配置虚拟路径,需要在web.xml中配置虚拟路径
因为数据的呈现需要用到页面,而Servlet类比较适合做业务逻辑,所以要创建一个jsp页面

package cc.java.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo extends HttpServlet {

	
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("我是doGet()");
	}


	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("我是doPost()");
	}
	
}

在WebContent—WEB-INF目录下有一个web.xml文件,通过这个xml来设置LoginServlet的虚拟路径

给LoginServlet类配置一个对外访问的路径 通过标签来配置

1.使用<servlet>标签 一个<servlet>标签就代表一个类 <servlet>中有两个标签<servlet-name>和<servlet-class>

其中<servlet-class>是描述当前类的具体路径,也就是LoginServlet.java 路径写法就是”所在的包名+类名”,

2.<servlet-name>中的名称尽量和类名保持一致   配置好别名之后,正式开始配置访问路径 <servlet-mapping>中有两个标签<servlet-name>和<url-patten>

<servlet-name>中的值和<servlet>中的<servlet-name>值保持一致 接下来配置一个对外的访问路径 /LoginServlet /代表的就是我们的服务器地址,目前是Tomcat和我们的工程名

<?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_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>zhumeng-servlet1</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-name>LoginServlet</servlet-name>
    <servlet-class>cn.java.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
</web-app>

设置好xml中的内容后,我们可以先测试一下,运行LoginServlet.java,此时控制台会输出”我是doGet()”方法,这也是默认使用的方法

 

如果要实现输出”我是Post()”方法我们就需要创建一个jsp页面

<form>中action的值为”http://localhost:8080/zhumeng-servlet/LoginServlet”,这里method=”post”,请求方式为post

接下来运行jsp程序,点击登录就会显示”我是Post()”方法

目前的action中值是固定,我们要实现动态地址 在上面的定义处 String path = “”;

request.getScheme()该方法是返回协议,也就是http

request.getServerName()该方法返回的是字符串,也就是IP地址

request.gerServerPort()该方法是获得端口

request.getServletContext().getContextPath()动态获取工程名

前面可以不加”/” 因为getContextPath()返回值有”/” 通过脚本符号来写入到action 中

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
	<% 	String path = request.getScheme()+":"+"//"+request.getServerName()+":"+
		request.getServerPort()+request.getServletContext().getContextPath()+"/";
	%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
	<div align="center">
		<form action="<%=path%> >/LoginServlet" method="post">
			<p>
				用户名: <input type="text" name="username">
			</p>
			<p>
				密&nbsp;码 <input type="password" name="password">
			</p>
			<p>
				<input type="submit" value="登录"><input type="reset"
					value="重置">
			</p>
		</form>
	</div>
</body>
</html>

 

Servlet的生命周期

  • 初始化阶段调用init()方法
  • 响应客户请求阶段调用service()方法
  • 终止阶段调用destroy()方法

init():Servlet第一次被访问的时候调用

service():每次请求都会被调用

destory():当Servlet被销毁的时候调用

可以通过更快捷的方式来创建service类,右键包名—new—Servlet就可以实现快捷创建Servlet类

生成的servlet按照下面的方法来抒写,不需要的注释就删掉

自动生成的servlet类中有注解:@WebServlet(“/LifeServlet”),这句话等于xml写的虚拟路径,也就是说可以通过标签页可以通过注解来声明虚拟路径

package cc.java.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Dmeo")
public class Dmeo extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

ServletContext与ServletConfig

java是一门面向对象的语音,万事万物皆对象。整个JavaWeb工程也可以用一个对象来表示,这个对象就是ServletContext类型。

我们可以在web.html文件中给某一个Servlet配置一些配置信息,当服务器被启动的时候,这些配置信息就会被封装代某一个ServletConfig对象中去。因此ServletConfig表示的是某一个Servlet的配置文件

创建一个新的Servlet类的

  • ServletContext对象:表示的是整个JavaWeb工程
  • ServletConfig对象:表示的是某一个Servlet中的配置文件

1.获取代表某一个JavaWeb工程的ServletContext对象  context代表着整个javaweb工程,context对象是一个域对象,可以往某一个域对象中存放数据,并且还可以取出存放数据

2.往context域对象中存放数据

3.取出context域对象中的数据

因为ServletContext代表的是整个工程,所以另一个Servlet也可以直接调用,通过key-value的方式

ServletConfig对象需要通过xml来配置后才能使用,在之前创建的xml中,通过标签的来配置。只要需在xml文件中添加一下标签即可

一旦Servlet类被启动,这两个参数就会被封装一个对象中 这个对象就是Demo3Servlet中的ServletConfig

配置好xml文件后,在Demo3Servlet.java中使用ServletConfig

 

转发和重定向

相同点:转发和重定向都是实现页面跳转,也就是说当我们访问Serlvet的时候,Servlet帮我跳转到另一个jsp页面,而跳转就需要通过转发和重定向来实现。

不同点:

实现转发调用的是HttpServletRequest对象中的方法,实现重定向调用的是HttpServletResponse

转发时浏览器中的url地址栏是不会发生改变,重定向时浏览器中的url地址会发生改变

转发时向浏览器请求一次服务器,重定向时向浏览器请求两次服务器

首先先创建两个jsp页面,用来实现密码正确和错误

然后在LonginServlet.java进行业务逻辑判断

如果usename=admin password=1234 跳转到success.jsp,否则跳转到fail.jsp,通过转发来实现跳转。

request.getRequestDispatcher(“/sccess.jsp”).forward(request, response); 其实(“/sccess.jsp”)中的”/”代表项目工程

无论是输入正确或者错误的密码后,浏览器的地址并没有跳转到sccess.jsp或者fail.jsp中,这就是转发的特点

把else中的语句换一下,换成response.sendRedirect(“/zhumeng-servlet1/fail.jsp”);

response比较特殊需要把工程名全写上才能实现效果。

当输入账号和密码错误的时候,使用重定向来跳转网页,此时浏览器上的url地址发生了变化

 

物联沃分享整理
物联沃-IOTWORD物联网 » Servlet入门笔记和代码

发表评论