赞
踩
目录
·B/S 是Browser/Server浏览器/服务器 模式,
PreparedStatement类还可以为sql语句设置参数。
只要在服务器装好后,其他人只需要用浏览器(比如IE)就可以正常浏览。
比如?
服务器装好后,其他人还需要在客户端的电脑上安装专用的客户端软件才能正常浏览操作。
比如?
响应状态码表示服务器对请求的各种不同处理结果和状态
200:表示客户端请求成功
400:请求的语法有错误,不能被服务器所理解
401:请求未经过授权,必须和WWW-Authenticate报头域一起使用
403:服务器收到请求,但是拒绝服务
404:请求资源不存在,例如:输入了错误的URL
500:服务器发生了不可预期的错误
503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
1.创建工程news
2.在工程中创建一个JSP测试欢迎界面welcome.jsp
3.发布工程news;
4.调试运行页面welcome.jsp
可分为:
1.脚本(Scriplets)
2.表达式(experssion)
3.声明(declaration)
javaBean在Web开发中通常用于封装数据
Bean:直译豆子,可以理解为一个相对独立的实体
JavaBean:java语言的豆子?!其实就说一个普通的java类
1.构造方法没有参数
2.成员变量安全,最好定义为私有
3.需要访问的成员变量应该有get和set方法
JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。
-访问界面时,会提交应该HTTP请求,服务器收到请求时,返回HTTP响应。响应和请求类似,也有某种结构,每个响应都由状态行开始,可以包含几个头及可能的信息体
-response 响应对象与request请求对象相对应。我们送数据。比如,当一个客户请求访问一个JSP页面时,该页面用page指令设置的contentType属性值应该是text/html,那么JSP引擎将按着
这种属性值响应客户对页面的请求,将页面的静态部分返回给客户
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
·void setAttribute(String name,Object value)
-以键/值的方式,将一个对象的值存放到session中,参数name是键,表示一个对象的值保存在session中的时候给该值取 的名字;参数value是对象的值
·Object getAttribute(String name)
-根据键去获取session中存放对象的值。参数name就是键,它来源于setAttribute方法中参数的name。
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
每个内置对象的作用:
request. getAttribute
request.setAttribute
生命周期又叫作用域:指对象的存在时间/存在范围或者说起作用的时间/范围,超过这个时间/范围,该对象将不能使用/不存在
内置对象的作用域包括page、request、session和application
从大到小为:application>session>request>page
如果一个属性指定几个只的话,这些值用逗号分割。
例如:
<%@ page import= "java.util.*","java.io.*","java.awt.*"%>
·当你import指定多个属性时,JSP引擎把JSP页面转译成java文件中会有如下的import语句:
import java.util.*;
import.java.io.*;
import java.awt.*;
如
<% @page contentType= "text/heml;charset=GB2312" %>
<% @page import="java.util.*" %>
<% @page import="java.util.*,"java.awt.*" %>
下列用法是错误的:(指定两次)
<% @page contentType= "text/heml;charset=GB2312" %>
<% @page contentType= "text/heml;charset=GB2312" %>
·注:page指令的作用对整个页面有效,与其书写的位置无关,但习惯把page指令写在JSP页面的最前面
<jsp:include>: 在用户请求时包含文件(动态包含)
include动作的语法如下:
<jsp:include page="包含文件的路径与名称">
该动作标签告诉JSP页面动态包含一个文件,即包含和被包含的文件各自编译,当用户请求页面时,才动态地将文件加入。
在JSP页面中,经常需要对集合对象进行循环迭代操作,为此,Core标签库提供一个<c:forEach>标签,该标签专门用于迭代集合对象中的元素,如Set、List、Map、数组等,并且能重复执行标签体中的内容。
迭代包含多个对象的集合语法格式:
<c:forEach [var="varName"] items ="collection"
[varStatus="varStatusName"]
<[begin="begin"][end="end"][steo="step"]>
</c:forEach>
·Servlet的生命周期就是指创建Servlet实例之后其存在的时间以及何时消失
实例化——> Servlet容器创见Servlet的实例
初始化——>该容器调用Init()方法
服务——>如果请求Servlet,则容器调用service
销毁——>销毁实例之前调用destroy()方法
不可用——>销毁实例并标记为垃圾收集
调用service()方法处理客户端请求。
service()方法首先获得关于请求对象的信息,处理请求,访问相关资源,获得需要的信息。然后service()方法使用相应对象的方法将响应传回Web服务器,Web服务器,Web服务器做响应处理后再将其传送回客户端。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象,和一个新的HttpServletResponse响应对象,然后将这两个对象,作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doGet()或者doPost()方法。
我们可以手动的去servlet类,继承HttpServlet并覆写doGet,doPost方法。但在eclipse中,我们也可以用更简便的方法去建立Servlet类
在web.xml中加入的代码如下两段话:
-<servlet>
-//servletd的名字 (自己命名,每个servlet的取名唯一)
-<servlet-name>RegServlet</servlet-name>
-//Servlet程序所在的地址(对应的包.类的名称)
-<servlet-class>servlet.RegServlet</servlet-class>
-</servlet>
-<servlet-mapping>
-//<servletd的名字(与上面servlet的名字一致)
-<servlet-name>RegServlet</servlet-name>
-//具体的映射路径(别名,自己命名,每个servlet的别名唯一),前面必须有一个‘/’
-<url-pattern>/RegServlet</url-pattern>
-</servlet-mapping>
注解的方式对标了配置方式的效果,相比之下注解的方式要简单很多,但对于理解而言我建议掌握配置文件的原理,注解完全是因为java性能足够高才能自动实现的。
对于比较复杂的业务功能,经常需要多个servlet配合实现,这是就需要从一个servlet跳转到另外一个servlet,servlet之间的跳转方式可分为转发(forward)和重定向(redirect)两种
在HttpServletRequest到达servlet之前,拦截客户HttpServletRequest。
根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
根据需要检查HttpServletResponse,可以修改HttpServletResponse头和数据
·HttpSessionAttributeListener 接口 用于监听session对象属性的改变事件。
-1.attributeAdded():在session中添加属性时,该方法将会被调用。也就是说调用session. setAttribute()这个方法时候会触发的。
-2.attributeRemoved():删除session中属性时,该方法将会被调用。也就是说调用session.removeAttribute()这个方法的时候会触发的。
-3.attributeReplaced():在session属性被重新设置时,该方法将会被调用。
-使用DriverManager类的getConnection方法来获得一个数据库连接对象(也就是这个方法返回一个Connection对象),当对象成功获得时,表示数据库连接成功
-连接命令格式:DriverManager.getConnection(url,login,password)
执行SQL语句进行数据库操作
-数据库的查询操作:调用上一步骤生成的statement对象中的executeQuery方法,命令格式为:
ResultSet rs = statement. executeQuery(sql语句);
-返回值:ResultSet是保存查询结果(可能是多条记录)的一个类集,我们可以通过调用ResultSet类的next方法获得下一条记录,通过调用getXXX方法(XXX表示数据类型)来获得某条记录中的某个字段的值
-sql语句:字符串形式的查询语句,需要返回结果
·ResultSet类对象的使用
执行ResultSet rs = statement.executeQuery("");方法可以等到一个结果集,ResultSet类的对象rs具有指向当前的数据行的指针。最初,指针被置于第一行之前。也就是说没有指向任何记录。
next()方法将指针移动到下一行,如果下一行有数据则next()方法返回true,否则返回false
预编译类PreparedStatement是java.sql中的一个接口,它是Statement的子接口,用于执行预编译的SQL语句。
与创建Statement不同的是在创建PreparedStatement对象时就指定了sql语句,该语句立即发送给数据库进行编译。当该编译语句被执行时,数据库直接运行编译被执行后,数据库直接运行编译后的sql语句。
使用PreparedStatement类我们可以将年龄设为参数,用问号"?"来表示。
调用PreparedStatement对象的sexXXX()方法来设置这些参数的值,XXX代表数据类型。setXXX()方法有两个参数,第一个参数是要设置sql语句中的参数的索引(即位置,从1开始),第二个是设置的sql语句中的参数的值。
- String sql = "select * from customer where age>?";//年龄作为参数
- PreparedStatement ps = Connection.prepareStatement(sql);
- ps.setInt(1,20);//设置SQL语句中的第一个参数的值为20
- ResultSet rs = ps.executeQuery();
- while(rs.next()){
- System.out.print(rs.getInit(1)+" ");
- System.out.print(rs.getInit(2)+" ");
- System.out.print(rs.getInit(2)+" ");
- }
数据在处理sql语句时都要一个预编译的过程,而预编译对象就是把一些格式固定的sql编译后,存放在内存池中即数据库缓冲池,当我们再次执行相同的sql语句时就不需要预编译的过程了,只需数据库运行sql语句。使用当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,特别是大型的数据库中,它可以有效的加快访问数据库的速度。
比如向用户表user中插入记录,插入的数据封装在User类的对象user中时,使用Statement的sql语句需要进行字符串拼接,如下:
- String sql = "insert into user(id,password,name,email,address) value('"+
- user,id+"",'"+
- user.passwrod+"','"+
- user.name+"','"+
- user.email+"','"+
- user.address+"')'";
使用PreparedStatement的sql语句如下:
- String sql =“insert into user(id,password,name,email,address) values(?,?,?,?,?)";
- PreparedStatement pstmt = connection.preparedstatement(sql);
- pstmt.setString(1,user.id);
- pstmt.setString(2,user.password);
- pstmt.setString(3,user.name);
- pstmt.setString(4,user.eamil);
- pstmt.setString(5,user.address);
使用占位符?(英文)代替参数,将参数与sql语句分离出来,这就可以方便对程序的更改和延续,同样也可以减少不必要的错误,代码的可读性和可维护性都更好。
sql注入攻击:是从客户端输入一些非法的特殊字符,从而使服务器端在构造sql语句时仍能正常构造,从而收集程序和服务器的信息或数据
String sql = "select * from user where id = '" +id +"' and passwrod = '"+password+ " '";
如果用户名和密码输入的都“‘1’ or 1=1 ”,则服务端生成的sql语句如下:
String sql = "select * from user where id = '1' and password = '1' or 1=1";
这个sql语句中where子句没有起到数据筛选的作用,因为有or 1=1,这是恒成立的。而PreparedStatement使用的是参数设置,就不会有这个问题存在。
·加载数据库驱动程序(使用clss类的静态方法forName加载):
--格式:Class.forName("数据库驱动名称");
--例如:装在Oracle JDBC驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
--例如:装在MS SQLServer驱动
Class.forName("com.mircosoft.jdbc.sqlserver.SQLServerDrive");
--例如:装在MySQL 驱动
Class.forName("com.mysql.jdbc.Driver");
·数据总条数(total)
查询数据库:select count(1) as total from tb_brand;
页面大小(pageSize)
用户自定义:5/10/20等
总页数(pageNum)
pageNum=(total%pageSize==0?total/pageSize+1)
当前页:(current):用户自定义,从1开始。
当前页的数据集合(List)
查询数据库 : select * from tb_brand order by ordered
limit (current-1)*pageSize,pageSize
-耦合性低
-重用性高
-开发成本低
-部署快
-可维护性高
-有利于软件工程化管理
-各个层没有明确定义
-不适合小型、中等规模的应用程序
-增加系统结构和实现的复杂性
-M是Model的简写,意思是模型。程序员编写程序应有的功能(实现算法等等)、数据库担当者进行数据管理和数据库设计(可以实现具体的功能)。
-V是View的简写,意思是视图。界面设计人员进行图形界面设计。
-C是Controller的简写,意思是控制器。负责转发请求,对请求进行处理
-MVC就是Model-View-Controller的简称,即模型-视图-控制器
-模型(Model):负责封装应用的状态,并实现应用的功能。通常又分为数据模型和业务逻辑模型,数据模型用来存放业务数据,比如:订单信息、用户信息、等;而业务逻辑模型包含应用的业务操作,比如订单的添加或者修改等。
-视图(View):用来将模型的内容展现给用户,用户可以通过视图来请求模型进行更新。视图从模型获得要展示的数据,然后用自己的方式展现给用户,相当于提供界面来与用户进行人机交互:
用户在界面操作或者填写完成后,会点击提交按钮或是以其他触发事件的方式,来向控制器发出请求
-控制器(Controller):用来控制应用程序的流程和处理视图所发出的请求的功能;然后控制器会选择用于响应的视图,把模型更新后的数据展示给用户
服务器端:
采用form表单方式提交上传我呢见,需要做到如下几点:
1.method必须是post
2.form表单属性enctype的必须是multipart/form-data
3.提供input type =“file” 类 的上传输入域,必须设置name属性,否则浏览器将不会发送上传文件的数据
- <form action="uplpad.do" method="post" enctype="multipart/form-data">
- 姓名:<input name="username"><br>
- 上传文件1:<input type="file" name="f1"><br>
- 上传文件2:<input type="file" name="f2"><br>
- 上传文件3:<input type="file" name="f2"><br>
- <input type="submit" value="上传">
- </form>
程序实现下载需设置两个响应头,Content-Type和Content-Disposition
(1)设置Content-Type的值为:
application/octet-stream。Web服务器需要告诉浏览器其所输出的内容的类型不是普通的文本文件或HTML文件,而是一个要保存到本地的下载文件;
(2)调用response.getOutStream()方法返回ServletOutStream对象来向客户端写入文件内容
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。