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 hereSystem.out.println("init it");}public ServletConfig getServletConfig() {// TODO: Add your code herereturn null;}/** @param parm1 req用于获得客户端(浏览器)信息* @param parm2 res用于向客户端(浏览器)返回信息*这个函数用于处理业务逻辑,当用户每次访问该servlet时都会被调用*/public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// TODO: Add your code hereSystem.out.println("service it");//从res中得到PrintWriterPrintWriter pw=res.getWriter();pw.println("hello world");}/**/public String getServletInfo() {// TODO: Add your code herereturn " ";}/*** Method destroy**释放内存*1.reload 该servlet(webapps)//2.关闭tomcat//3.关机*/public void destroy() {// TODO: Add your code hereSystem.out.println("destroy");}}
xml配置
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements.  See the NOTICE file distributed withthis 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 withthe License.  You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed 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 andlimitations 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 exceptione.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 exceptione.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 exceptione.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")){//合法,跳转到welres.sendRedirect("wel");}else{//不合法,跳转到Loginres.sendRedirect("login");}} catch (Exception e) {// TODO: handle exceptione.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 exceptione.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 exceptione.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);//创建一个Statementsm=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//将验证成功的信息写入sessionHttpSession hs=req.getSession(true);//修改session的存在时间 单位shs.setMaxInactiveInterval(20);hs.setAttribute("pass", "ok");res.sendRedirect("wel?uname="+u+"&upass="+p);}else{//不合法,跳转到Loginres.sendRedirect("login");}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}finally{try {if(rs!=null) rs.close();if(sm!=null) sm.close();if(ct!=null) ct.close();} catch (Exception e2) {// TODO: handle exceptione2.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){//得到sessionHttpSession 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 exceptione.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//将验证成功的信息写入sessionHttpSession hs=req.getSession(true);//修改session的存在时间 单位shs.setMaxInactiveInterval(20);hs.setAttribute("name", u);res.sendRedirect("wel");}}else{//不合法,跳转到Loginres.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 spdbinsert 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'

Servlet教程第0~3讲笔记相关推荐

  1. Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  2. CG基础教程-陈惟老师十二讲笔记

    转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...

  3. 【黑马程序员 C++教程从0到1入门编程】【笔记3】C++核心编程(内存分区模型、引用、函数提高)

    黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1 内存分区模型 1.1 程序运行前 1.2 程序运行后(手动开辟内存:c语言malloc,c++new) 1.3 new操作 ...

  4. 【黑马程序员 C++教程从0到1入门编程】【笔记2】通讯录管理系统

    黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.系统需求 2.创建项目 2.1 创建项目 3.菜单功能 4.退出功能 5.添加联系人 5.1 设计联系人结构体 5.2 设 ...

  5. 【黑马程序员 C++教程从0到1入门编程】【笔记1】数据类型、运算符、程序流程结构、数组、函数、指针、结构体

    黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.C++初识 1.1 第一个c++程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 2 ...

  6. 区块链教程Fabric1.0源代码gRPC(Fabric中注册的gRPC Service)一

    区块链教程Fabric1.0源代码分析gRPC(Fabric中注册的gRPC Service)一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落 ...

  7. 区块链教程Fabric1.0源代码分析scc(系统链码)

    区块链教程Fabric1.0源代码分析scc(系统链码),2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退,让人们更 ...

  8. 区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现

    区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实 ...

  9. 区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一

    区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期 ...

  10. 视觉SLAM总结——视觉SLAM十四讲笔记整理

    视觉SLAM总结--视觉SLAM十四讲笔记整理 说明 基础知识点 1. 特征提取.特征匹配 (1)Harris (2)SIFT (3)SUFT (4)ORB (5)特征匹配 2. 2D-2D:对极约束 ...

最新文章

  1. JavaScript的“ this”通过成立一个高中乐队来解释
  2. select frame 什么意思?
  3. 【转】C++ Vector(向量容器)
  4. 【CentOS】磁盘管理与vim编译器
  5. DCMTK:创建大型(> 4 GB)增强型CT对象的测试
  6. spring中的spel表达式语言
  7. 实现“Please wait...”效果
  8. 阿里云500服务器内部错误,腾讯云服务器网站不能打开 提示内部错误http 500
  9. apache shiro_Apache Shiro第1部分–基础
  10. 微信推送封面尺寸_连封面图都搞不明白,做什么新时代的新媒体人?
  11. 深度学习之神经网络的结构
  12. Redis 处理客户端连接的一些内部实现机制
  13. Python案例:飞船向右发射子弹
  14. Dropthings - Ajax Web Portal
  15. 毕设设计要点整理(一)——角色相关
  16. java SE复习笔记54
  17. 面试-03-数据库和事务专题
  18. 和导师闹僵跑来实习?拼了命也要拿到大厂实习offer
  19. 三维智慧城市数字孪生应用可视化设计
  20. 如何用google translate API接口

热门文章

  1. 关于struct和class的知识
  2. 数据-第6课-线性表的相关操作
  3. 基于Android的小巫新闻客户端开发系列教程
  4. 四大顶级开源网络管理工具详解
  5. 微服务设计笔记——几种远程过程调用方法
  6. 中国高铁走向全球,一个行业标准帮了大忙
  7. ubuntu 常用配置
  8. PHP--变量部分知识点
  9. 林锐:5 C++/C程序的基本概念
  10. phpstorm激活码生成器地址