Servlet教程第0~3讲笔记

servlet 第0讲 教程简介

计算机基础
java SE
java EE
c/s
b/s
html-javascript-java ee

secret:think->program->think…

servlet 第1讲 网页技术简介

分页系统简介
动态网页技术的发展
1993 html 静态文字图片,不能与用户交互。

(1)cgi
cgi(common gateway interface)
早期的动态技术使用的最多的,发展比较成熟,并且功能强大。
效率比较低,编程困难。
cgi可以用不同的语言编写。
现在使用cgi做动态网网页比较少,但还是有,主要用linux/unix系统。

(2)asp
asp是html+javascript(vbscript)+com组件的形式,com组件的开发比较困难。
1.简单易学
2.安装使用方便(windows+iis)在win98是使用(pws作为asp的服务器)
3.效率比cgi高。
1.功能扩张比较困难
2.安全性问题
3.跨平台性
4.实现企业级困难

(3)php (php+mysql+linux+apache 全部免费)
1.跨平台性良好,多数据库支持
2.效率比较高,具有良好的安全性。
3.免费试用
1.安装复杂
2.缺少企业级的支持
3.php是自由软件组织开发的,缺少正规的公司对其负责。

(4)jsp
jsp=html+java片段+jsp语法+js
1.1一次编写,到处运行
2.良好的跨平台性
3.多种开发工具支持
4.强大的可伸缩性(jsp+javabean)的方式
1.jsp产品的复杂度高(jsp入门必asp难)
2.jsp要求运行的机器配置要高,因为jsp是用class常驻内存的方式运行的,效率高,但是需要占用更多的内存。

jsp和asp的比较
b/s和c/s的比较

Servlet的介绍
Servlet(java服务器小程序)是用java编写的服务器程序,它的特点是
1.它是有服务器端调用和执行的。
2.它是用java语言编写的
3.它是按照Servlet规范开发的
4.功能强大,可以完成几乎所有网站功能

Servlet/jsp开发工具
普通文本编辑器 notepad,uedit32
集成开发工具就jcreator,jbuilder,eclipse,editplus netbean

运行环境
绝大部分浏览器
Web服务器 Tomcat、Bea weblogic、Ibm Websphere、Resin
数据库
sql 2000、Sybase、mysql

Tomcat是一个免费的开源的Servlet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其他一些公司及个人共同开发而成。

由于有了Sun的参与与支持,最新的Servlet和Jsp规范总能再Tomcat中体现。

Tomcat的三个功能
1.web服务器
2.jsp容器
3.servlet容器

tomcat的安装和启动

Servlet第2讲 Servlet简介

(一)servlet体系结构
(二)servlet的网络拓扑结构
(三)servlet的几个实例
(四)servlet的生命周期
(五)一个简单的用户登录系统

(一)servlet体系结构
java.lang.Object
java.io.Seniabzable
javax.servlet.Servlet
javax.servlet.ServletConfig
javax.servlet.GenerateServlet
java.io.InputStream
javax.servletServletInputStream
java.io.OutputStream
javax.servletServletOutputStream
java.lang.Throwable
java.lang.Exception
javax.servlet.ServletException
javax.servlet.UnabailableException

(二)Servlet/jsp网络拓扑结构
IE浏览器 界面层(美工) Tomcat逻辑层(程序员)
数据库(数据库分析员)

(三)Servlet的几个实例

开发servlet的三种方法
实现servlet接口
继承GenericServlet
继承HttpServlet

实现servlet接口

/**
 * @(#)Hello.java
 *
 *
 * @author 
 * @version 1.00 2019/2/21
 */
package com.tingwei;
import javax.servlet.*;
import java.io.*;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class Hello  implements Servlet{
	
	/**
	 * Method init
	 *
	 *
	 * @param parm1 该函数只会被调用一次,当用户第一次访问该servlet时被调用
	 *
	 @throws ServletException
	 *
	 */
	public void init(ServletConfig parm1) throws ServletException {
		// TODO: Add your code here
		System.out.println("init it");
	}

	public ServletConfig getServletConfig() {
		// TODO: Add your code here
		return null;
	}

	/*
	 * @param parm1 req用于获得客户端(浏览器)信息
	 * @param parm2 res用于向客户端(浏览器)返回信息

	 *这个函数用于处理业务逻辑,当用户每次访问该servlet时都会被调用
	 */
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO: Add your code here
		System.out.println("service it");
		//从res中得到PrintWriter
		PrintWriter pw=res.getWriter();
		pw.println("hello world");
	}

	/*
	 */
	public String getServletInfo() {
		// TODO: Add your code here
		return " ";
	}

	/**
	 * Method destroy
	 *
	 *释放内存
	 *1.reload 该servlet(webapps)//2.关闭tomcat//3.关机
	 */
	public void destroy() {
		// TODO: Add your code here
		System.out.println("destroy");
	}
    
    
} 
xml配置
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<web-app>
  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
  
  <!--每写一个servlet都要部署-->
  <servlet>
  <!--给你的servlet取名-->
	<servlet-name>hello</servlet-name>
	<!--指明servlet的路径,包名+类名-->
	<servlet-class>com.tingwei.Hello</servlet-class>
  </servlet>
  
  <servlet-mapping>
	<servlet-name>hello</servlet-name>
	<!--在浏览器中输入的访问该servlet的url,任意的-->
	<url-pattern>/sp</url-pattern>
  </servlet-mapping>

</web-app>

输入http://localhost:8080/myWebSite/sp
回车,显示出hello world

第二种方式,通过继承GenericServlet开发Servlet

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--  -->

<web-app>
  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
  
  
    <!--每写一个servlet都要部署-->
  <servlet>
  <!--给你的servlet取名-->
	<servlet-name>hellogen</servlet-name>
	<!--指明servlet的路径,包名+类名-->
	<servlet-class>com.tingwei.HelloGen</servlet-class>
  </servlet>
  
  <servlet-mapping>
	<servlet-name>hellogen</servlet-name>
	<!--在浏览器中输入的访问该servlet的url,任意的-->
	<url-pattern>/hellogen</url-pattern>
  </servlet-mapping>

</web-app>
//This is the second method of developing servlet (extends GenericServlet)
package com.tingwei;
import javax.servlet.*;
import java.io.*;
@SuppressWarnings("serial")
public class HelloGen extends GenericServlet{
	//重写 service即可
	public void service(ServletRequest req,ServletResponse res)
	{
		try {
			PrintWriter pw=res.getWriter();
			pw.println("hello,world!generic");
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}

第三种方式,通过继承HttpServlet开发Servlet
表单提交数据get请求和post请求的区别?

package com.tingwei;
import javax.servlet.http.*;
import java.io.*;
public class HelloHttp extends HttpServlet {
	public void doGet(HttpServletRequest req,HttpServletResponse res)
	{
		try {
			PrintWriter pw=res.getWriter();
			pw.println("hellohttp");
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public void doPost(HttpServletRequest req,HttpServletResponse res)
	{
		this.doGet(req, res);
	}
}
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--  -->

<web-app>
  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
  
  
    <!--每写一个servlet都要部署-->
  <servlet>
  <!--给你的servlet取名-->
	<servlet-name>hellohttp</servlet-name>
	<!--指明servlet的路径,包名+类名-->
	<servlet-class>com.tingwei.HelloHttp</servlet-class>
  </servlet>
  
  <servlet-mapping>
	<servlet-name>hellohttp</servlet-name>
	<!--在浏览器中输入的访问该servlet的url,任意的-->
	<url-pattern>/hellohttp</url-pattern>
  </servlet-mapping>

</web-app>

(四)用户登录网站
Login.java 登录界面
LoginCl.java 验证用户是否合法
Wel.java 欢迎界面
在这里插入图片描述

//登录界面
package com.tingwei;
import javax.servlet.http.*;
import java.io.*;
public class Login extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse res)
	{
		try {
			//中文乱码处理
			res.setContentType("text/html;charset=gbk");
			PrintWriter pw=res.getWriter();
			//返回登录界面
			pw.println("<html>");
			pw.println("<body>");
			pw.println("<form action=logincl method=post>");
			pw.println("用户名:<input type=text name=username><br>");
			pw.println("密码:<input type=password name=passwd><br>");
			pw.println("<input type=submit value=login><br>");
			pw.println("</form>");
			pw.println("</body>");
			pw.println("</html>");
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public void doPost(HttpServletRequest req,HttpServletResponse res)
	{
		this.doGet(req, res);
	}
}
//用户验证Servlet
package com.tingwei;
import javax.servlet.http.*;
import java.io.*;
public class LoginCl extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse res)
	{
		try {
			//接收用户名和密码
			String u=req.getParameter("username");
			String p=req.getParameter("passwd");
			
			//验证
			if(u.equals("sp") && p.equals("123")){
				//合法,跳转到wel
				res.sendRedirect("wel");
			}else{
				//不合法,跳转到Login
				res.sendRedirect("login");
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public void doPost(HttpServletRequest req,HttpServletResponse res)
	{
		this.doGet(req, res);
	}
}
//欢迎界面
package com.tingwei;
import javax.servlet.http.*;
import java.io.*;
public class Wel extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse res)
	{
		try {
			PrintWriter pw=res.getWriter();
			pw.println("welcome,hello");
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public void doPost(HttpServletRequest req,HttpServletResponse res)
	{
		this.doGet(req, res);
	}
}
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--  -->

<web-app>
  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
  

      <!--每写一个servlet都要部署-->
  <servlet>
  <!--给你的servlet取名-->
	<servlet-name>login</servlet-name>
	<!--指明servlet的路径,包名+类名-->
	<servlet-class>com.tingwei.Login</servlet-class>
  </servlet>
  
  <servlet-mapping>
	<servlet-name>login</servlet-name>
	<!--在浏览器中输入的访问该servlet的url,任意的-->
	<url-pattern>/login</url-pattern>
  </servlet-mapping>
  
        <!--每写一个servlet都要部署-->
  <servlet>
  <!--给你的servlet取名-->
	<servlet-name>wel</servlet-name>
	<!--指明servlet的路径,包名+类名-->
	<servlet-class>com.tingwei.Wel</servlet-class>
  </servlet>
  
  <servlet-mapping>
	<servlet-name>wel</servlet-name>
	<!--在浏览器中输入的访问该servlet的url,任意的-->
	<url-pattern>/wel</url-pattern>
  </servlet-mapping>
  
        <!--每写一个servlet都要部署-->
  <servlet>
  <!--给你的servlet取名-->
	<servlet-name>logincl</servlet-name>
	<!--指明servlet的路径,包名+类名-->
	<servlet-class>com.tingwei.LoginCl</servlet-class>
  </servlet>
  
  <servlet-mapping>
	<servlet-name>logincl</servlet-name>
	<!--在浏览器中输入的访问该servlet的url,任意的-->
	<url-pattern>/logincl</url-pattern>
  </servlet-mapping>
  
    
</web-app>

第三讲

1.同一用户的不同页面共享数据四种方法

cookie
sendRedirct()
隐藏表单
session

cookie
服务器在客户端保存用户的信息,这些信息量就像小甜饼一样,数据量并不大,服务器端在需要的时候可以从客户端读取,一般保存在客户端的C:\Documents and Settings目录下

cookie的作用是
保存用户名、密码,在一段时间内不用重新登录
记录用户网站的喜好
网站的个性化

sendedirct(“welcom?uname=zhangsan”);

session
什么是session?
当用户打开浏览器,访问某个网站时,服务器就会在服务器的内存为该浏览器分配一个内存空间,该空间被这个浏览器独占,这个空间就是session空间,该空间中的数据默认是30minute,也可以修改

session的用处
网上商城中的购物车
保存登录用户的信息
将某些数据放入到session中
防止用户非法登录到某个页面

Servlet 链接数据库sqlserver

在这里插入图片描述
用session来防止用户非法登录的例子

package com.tingwei;
import javax.servlet.http.*;
import java.io.*;
public class Login extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse res)
	{
		try {
			//中文乱码处理
			res.setContentType("text/html;charset=gbk");
			PrintWriter pw=res.getWriter();
			//返回登录界面
			pw.println("<html>");
			pw.println("<body>");
			pw.println("<h>登录界面</h>");
			pw.println("<form action=logincl method=post>");
			pw.println("用户名:<input type=text name=username><br>");
			pw.println("密码:<input type=password name=passwd><br>");
			pw.println("<input type=submit value=login><br>");
			pw.println("</form>");
			pw.println("</body>");
			pw.println("</html>");
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public void doPost(HttpServletRequest req,HttpServletResponse res)
	{
		this.doGet(req, res);
	}
}
//用户验证Servlet
package com.tingwei;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
public class LoginCl extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse res)
	{
		Connection ct=null;
		Statement sm=null;
		ResultSet rs=null;
		String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=spdb";
		String user="sa";
		String passwd="tingwei";
		String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";
		
		//业务逻辑
		try {
			//接收用户名和密码
			String u=req.getParameter("username");
			String p=req.getParameter("passwd");
			
			//连接接数据库,三部曲
			
			Class.forName(driver);
			//得到连接
			ct=DriverManager.getConnection(url,user,passwd);
			//创建一个Statement
			sm=ct.createStatement();
			String query="select top 1 *from users where usernaem='"+u+"' and passwd='"+p+"'";
			System.out.println(query);
			rs=sm.executeQuery(query);
			
			//验证
			if(rs.next()){
				//合法,跳转到wel
				//将验证成功的信息写入session
				HttpSession hs=req.getSession(true);
				//修改session的存在时间 单位s
				hs.setMaxInactiveInterval(20);
				hs.setAttribute("pass", "ok");
				res.sendRedirect("wel?uname="+u+"&upass="+p);
			}else{
				//不合法,跳转到Login
				res.sendRedirect("login");
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
				try {
					if(rs!=null) rs.close();
					if(sm!=null) sm.close();
					if(ct!=null) ct.close();
				} catch (Exception e2) {
					// TODO: handle exception
					e2.printStackTrace();
				}
			}
	}
	
	public void doPost(HttpServletRequest req,HttpServletResponse res)
	{
		this.doGet(req, res);
	}
}
//用户验证Servlet
package com.tingwei;
import javax.servlet.http.*;

import java.io.*;
public class Wel extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse res)
	{
		//得到session
		HttpSession hs=req.getSession();
		String val=(String)hs.getAttribute("pass");
		//判断
		if(val==null)
			try {
				res.sendRedirect("login");
			} catch (IOException e1) {
				// TODO 自动生成的 catch 块
				e1.printStackTrace();
			}
		//得到从logincl传递的用户名
		String u=req.getParameter("uname");
		//得到从logincl传递的密码
		String p=req.getParameter("upass");
		try {
			PrintWriter pw=res.getWriter();
			pw.println("welcome,hello "+u+" pass="+p);
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public void doPost(HttpServletRequest req,HttpServletResponse res)
	{
		this.doGet(req, res);
	}
}

--注入漏洞的解决办法是
--查询语句使用
select top 1 passwd from users where usernaem='admin';
--当用户输入的用户名为admin时,与数据库中的密码相比较不会产生注入漏洞,前提是用户名唯一。

select top 1 *from users where usernaem='admin' and passwd='admin';
--这里比较的是用户输入的用户名和密码,所以会产生注入漏洞

//相应的LoginCl.java中的代码作如下修改

	if(re.next()){
	//说明用户存在
		String dbPasswd=rs.getString(1);
		if(dbdPasswd.equals(p)){
			//合法,跳转到wel
				//将验证成功的信息写入session
				HttpSession hs=req.getSession(true);
				//修改session的存在时间 单位s
				hs.setMaxInactiveInterval(20);
				hs.setAttribute("name", u);
				res.sendRedirect("wel");
		}
	}else{
				//不合法,跳转到Login
			res.sendRedirect("login");
	}

需要用到的sql语句

create database spdb
create tabler users(
userId int primary key identity(1,1),--用户id号
username varchar(20),--用户名
passwd varchar(20),--用户密码
emial varcher(30),--用户邮箱
grade int)--用户级别

use spdb

insert int users values
('admin','admin','admin@qq.com',1)
insert int users values
('admin','admin','admin@qq.com',1)
insert int users values
('admin','admin','admin@qq.com',1)
insert int users values
('admin','admin','admin@qq.com',1)
insert int users values
('admin','admin','admin@qq.com',1)

select *from users

--sql注入漏洞
select *from users where usernaem='anyword' and passwd='anyword'or 1='1'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值