Java web:重名验证load-on-startup servlet生命周期,学习笔记和代码例子【诗书画唱】









写完这篇专栏的时间(给个三连吧):

自己想出来的巧妙的重名验证方法关键:

1、创建一个servlet,运行它能够打印出访问这个servlet的次数

package com.jy;
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("/ms")
public class FangWenCount extends HttpServlet {
private static final long serialVersionUID = 1L;
private Integer count = 0;
public FangWenCount() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
count ++;
System.out.println("访问这个servlet的次数:"+count+"次");
}
}


2、创建两个load-on-startup servlet,要求启动项目后,后面写的servlet先运行。



package com.SSHC;
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;
/**
* Servlet implementation class LosServlet
*/
public class loadOnStartup1 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public loadOnStartup1() {
super();
// TODO Auto-generated constructor stub
}
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
System.out.println("随着项目启动运行的Loadonstartup servlet"
+ ":loadOnStartup1");
}
}


package com.SSHC;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class loadOnStartup2 extends HttpServlet {
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
System.out.println("另外的一个Loadonstartup servlet:loadOnStartup2");
}
}


<?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>JavaWebJSP</display-name>
<servlet>
<servlet-name>firstServlet-name</servlet-name>
<servlet-class>com.SSHC.loadOnStartup1</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>secondServlet-name</servlet-name>
<servlet-class>com.SSHC.loadOnStartup2</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<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>
</web-app>

在项目处鼠标右键,点"Run as"等:





3、创建一个servlet,第一次运行时在后台打印"您是第1个访问本应用的客户"

package com.SSHC;
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("/CountPerson")
public class CountPerson extends HttpServlet {
private static final long serialVersionUID = 1L;
private Integer count = 0;
public CountPerson() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
count ++;
System.out.println("您是第"+count+"个访问本应用的客户");
}
}


4、在WEB-INF目录下创建一个reg.jsp页面,创建一个servlet,当运行这个servlet时跳转到reg.jsp页面。(WEB-INF目录下的jsp页面只有通过转发的方式才可以访问到,
不能通过http://localhost:8080/J190801/WEB-INF/my.jsp的方式访问)


package com.SSHC;
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;
/**
* Servlet implementation class tiaoZhuanWEB
*/
@WebServlet("/tiaoZhuanWEB")
public class tiaoZhuanWEB extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public tiaoZhuanWEB() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request,
* HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
request.getRequestDispatcher("WEB-INF/reg.jsp")
.forward(request, response);
}
}


<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
用转发的方式成功跳转到WEB-INF目录下的reg.jsp界面!
<%System.out.println("用转发的方式成功跳转到WEB-INF目录下的reg.jsp界面!"); %>
</body>
</html>


5、设计一个servlet,运行它能够跳转到b站

package com.SSHC;
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;
/**
* Servlet implementation class BaiduServlet
*/
@WebServlet("/bs")
public class BilibiliTiaoZhuanServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public BilibiliTiaoZhuanServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest
* request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest
* request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
//跳转百度页面
response.sendRedirect("http://www.bilibili.com";);
}
}


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base hreff="<%=basePath%>">
<title></title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script type="text/javascript">
function naviTo(){
window.location.hreff = 'bs';
}
</script>
</head>
<body>
<input type="button" value="bilibil" onclick="naviTo();"/>
<a hreff="javascript:naviTo();">点击后按钮或超链接跳转到bilibili</a>
</body>
</html>



6、实现重名验证的业务。

package com.SSHC;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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 com.SSHC.DAO.UserDao;
import com.SSHC.bean.User;
/**
* Servlet implementation class RegServlet
*/
@WebServlet("/rs")
public class RegServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RegServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//中文乱码处理:
request.setCharacterEncoding("utf-8");
//1、获取用户输入的账号和密码:
String act = request.getParameter("act");
String pwd = request.getParameter("pwd");
//2、查询数据库:
UserDao userDao = new UserDao();
String msg = "";
int num=1;
List<User> list = userDao.selectAll();
for(User U : list) {
String act1= U.getAct();
// System.out.println(act1);
if(act.equals(act1)) {
num=num*0;
} else {
num=num*2;
}
} //有时用System.out.println(html)等来测试,找BUG等;
if(num==0) {
msg = "该账号已被使用";
request.setAttribute("msg", msg);
request.getRequestDispatcher("dupName.jsp")
.forward(request, response);
} else {
msg = "该账号可以注册";
request.setAttribute("msg", msg);
request.getRequestDispatcher("success.jsp")
.forward(request, response);
}
}
}


package com.SSHC.bean;
import java.util.Date;
//bean的类名于表的名字一致,而且首字母必须大写
public class User {
//bean类中的属性名应该和表中的列名一致
private Integer id;
private String act;
private String pwd;
private String birth;
private String sex;
private String hobbys;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAct() {
return act;
}
public void setAct(String act) {
this.act = act;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getBirth() {
return birth;
}
public void setBirth(String birth) {
this.birth = birth;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getHobbys() {
return hobbys;
}
public void setHobbys(String hobbys) {
this.hobbys = hobbys;
}
}

package com.SSHC.DAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.SSHC.Utils.DBUtils;
import com.SSHC.bean.User;
//DAO(Data Access Object)是一个数据访问接口,
//数据访问:顾名思义就是与数据库打交道。
//夹在业务逻辑与数据库资源中间。
///DAO就是实现增删改查的一个类
public class UserDao {
//用XXXDao(XXX为表名比如Eduinfo),Eduinfo:教育信息。
///XXXDAO可查询eduinfo表中的所有的数据。
//List用上泛型:
public List<User>selectAll(){
String sql = "select * from User";
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
List<User>list = new ArrayList<User>();
try {
// 下面用上DBUtils(当然命名为Dbutil,也可以
// 自己知道是数据库常用工具就可以了:
conn = DBUtils.getConn();
pstm = conn.prepareStatement(sql);
rs = pstm.executeQuery();
while(rs.next()) {
Integer id = rs.getInt("id");
String ename = rs.getString("act");
//进行打包:
User edu = new User();
edu.setId(id);
edu.setAct(ename);
//继续打包:
list.add(edu);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
}

package com.SSHC.Utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class DBUtils {
private static String driverName;
private static String url;
private static String user;
private static String pwd;
static {
//读取properties文件
Properties prop = new Properties();
//将db.properties文件读取到内存中去
InputStream is = DBUtils.class.getClassLoader()
.getResourceAsStream("db.properties");
//加载内容
try {
prop.load(is);
//读取内容
driverName = prop.getProperty("dn");
//System.out.println(driverName);
url = prop.getProperty("url");
user = prop.getProperty("un");
pwd = prop.getProperty("up");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取数据库连接对象的方法
public static Connection getConn(){
Connection conn = null;
try {
Class.forName(driverName);
conn = DriverManager
.getConnection(url,user,pwd);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void close(ResultSet
rs,PreparedStatement pstm
,Connection conn){
try {
if(rs != null) {
rs.close();
}
if(pstm != null) {
pstm.close();
}
if(conn != null) {
conn.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}

dn=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/firstjsp?useUnicode=true&characterEncoding=UTF-8
un=root
up=root

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@page import="com.SSHC.bean.User"%>
<%@page import="com.SSHC.DAO.UserDao"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base hreff="<%=basePath%>">
<title></title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<form action="rs" method="post">
<input type="text" name="act" placeholder="请输入账号" />
<div style="color:red;">${msg }</div>
<input type="submit" value="提交" />
</form>
</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base hreff="<%=basePath%>">
<title></title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<h1>${msg }</h1>
</body>
</html>

create table User(
id int primary key auto_increment,
act varchar(100) ,
pwd varchar(100) ,
sex char(100) ,
brith date,
hobbys varchar(100)
);





——————
自己写的题目等:
打印出访问Servlet的次数和使用“出生”和“销毁”的方法

package com.jy;
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;
/**
* Servlet implementation class MyServlet
*/
@WebServlet("/ms")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private Integer count = 0;
/**
* @see HttpServlet#HttpServlet()
*/
public MyServlet() {
super();
// TODO Auto-generated constructor stub
}
//当servlet被销毁时调用这个方法
//一般就是项目重启时会被销毁
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("被销毁了");
}
//当servlet被创建出来的时候调用
//在整个的servlet的生命周期中只会调用一次
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
System.out.println("我出生啦");
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.service(arg0, arg1);
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
count ++;
System.out.println(count);
}
}

例子:




下面是用于让”销毁“方法,让我们可以看到执行效果的方法,但有时不建议改bat,怕忘记改回来:







学习笔记:
一、HTTP协议
二、servlet
HTTP协议:超文本传输协议,文本代表字符串的意思,超文本代表图片,音频和视频
游戏的鼻祖:泥巴游戏mud,它是一个纯的文字游戏。
网络上面发送这些超文本时,就必须要遵守一定的规则,这样其他的人才能够接收到
的超文本内容,这个规则就叫超文本传输协议
Javaweb就遵循HTTP协议
HTTP协议有两个非常重要的请求方式:get请求方式和post请求方式
404:找不到你需要的资源(jsp页面,html页面以及servlet),访问路径如果不会就
会报这个错误
500:表示后台代码出现了错误(java代码)
200:表示请求成功了
Servlet:由java代码编写的一个小服务程序,它的作用非常的广泛,可以实现非常多
的功能,登录注册增删改查,附件上传下载,导出excel文件,servlet其实就是一个java类。
使用servlet:servlet虽然是一个java类,但是不能够直接运行。它必须启动tomcat服
务器以后才能运行。
创建一个servlet,运行它的时候在后台打印Hello world.
1、创建一个java类,让它继承HttpServlet类,重写doGet和doPost方法。
2、打开web.xml配置文件,对servlet进行配置。
快捷配置一个servlet:
当你在浏览器地址栏直接输入一个servlet的访问路径时,调用的是doGet方法
当在表单中运行一个servlet时,会根据表单的method属性来决定是调用doPost方法还是doGet方法。
post提交方式提交表单数据时,提交的数据不会显示在浏览器地址栏中
get提交方式提交表单数据时,提交的数据会显示在浏览器地址栏中。
post提交方式比较安全的。
get提交方式提交的数据量比较小
post提交方式提交的数据量比较大
一、servlet生命周期
二、init和destroy
三、loadonstartup servlet
四、servlet页面跳转方式
创建servlet的方式:
1、创建一个java类,让他继承HttpServlet,然后在web.xml中添加一段配置代码。
2、new servlet就可以创建出来
在项目中,创建servlet实例的时机:
1、当项目启动以后的第一个用户请求这个servlet时,就会new出一个servlet实例,
当这个用户使用完以后,servlet实例不会消失,会一直保存在项目中,当下一次有用户再次请求这个servlet的时候,就不会再new这个servlet,会直接使用前面保存在项目中的servlet实例。
2、随着项目启动,会自动的创建servlet
第二个用户也是访问这个servlet,不会再new出一个servlet实例了,它会直接使用第
一次new出来的servlet实例
loadonstartup servlet:随着项目的启动会自动运行的
通过servlet来进行页面跳转:
创建一个LoginServlet,运行这个servlet以后能够跳转到login.jsp页面
jsp页面每一个页面其实都是一个servlet
jsp页面转换成servlet类以后的源代码可以在tomcat服务器中的work目录下找到
jsp页面:在html代码中写java代码
servlet:在java代码中写html代码
实现重名验证