servlet与jsp核心编程卷1读书笔记

时间:2022-01-12 17:16:24
Servlet
从某种程度上,可以将servlet看作是含有html的java程序,将jsp看作是含有java代码的html页面
使用jsp还是servlet不在于功能而在于方便性、易用性和可维护性
服务器只在启动时,或给出服务器专有命令重新载入web应用时,才会读取web.xml,因此,每次修改完web.xml后都要重启服务器或重新载入web应用
打开servlet重新载入功能, servlet只被初始化一次
找到<!-- Define properties for each web application... -->
加入<DefaultContext reloadable="true"/>
url-pattern由斜杠开始,表示应用后面部分路径,必须将所有的servlet元素放置在任何servlet-mapping元素之前,他们不能相互混合
http响应报头由:状态行、一个或多个报头、一个空行和实际的文档以此次序构成,使用response.setContentTypy("text/html")
服务器只创建每个servlet的单一实例,每个用户请求都会引发新的线程-将用户请求交付给相应的doGet或doPost进行处理
生命周期:init-service-doPost/doGet-destroy
设置 init参数  1在servlet中添加init-param,指定初始化参数的键和值2在servlet的init方法中,调用getServletConfig。获取ServletConfig对象的引用3以参数的键为参数调用ServletConfig的getInitParameter,获取值或null
表单中如果action为空,则数据将提交给当前页面对应的URL,在表单action中 一定要使用相对URL,在发送字母数字字符时,浏览器不做任何改动,但 会将空格转换成加号,其他字符转换成%XY,即ASCII码,以十六进制表示。要使用javaBean的自动填充功能,需要使用jakarta通用库的BeanUtils、Collections、Logging组件
报头名称对大小写不敏感,setHeader/setDateHeader/setIntHeader做替换,addHeader/addDateHeader/addIntHeader添加一个报头,不管是否已存在
Content-Type标明响应文档MIME类型、Last-Modified标明文件的最后修改时间、Location状态码在300-399之间的响应应该包含这个报头,一般使用sendRedirect间接设置
 
JSP
html文本:<h1>test</h1>html注释:<!-- test -->jsp注释<%-- test --%>jsp表达式<%=test%>jsp scriptlet<% String test="test";%>jsp声明<%! field method %>jsp指令<%@ page %> <%@ include="" %><%@ taglib="" %>EL表达式${}
<%%>中代码被原封不动放在_jspService方法中,<%= %>代码被转换成 print 放在_jspService方法中
<%! %>声明被放在servlet类中
jsp页面转换成servlet后, jsp表达式生成print语句html生成print语句,同时被引号包裹scriptlet保持原样,这些print语句放 在_jspService方法中,无论是Get请求和Post请求都会调用_jspService方法,jsp中的out是jspWriter,JspWriter out = response.getWrite();
jsp指令主要有三种:page、include、taglib
<%@ page import="package.class1 ,...,package.classN"%>import 是 page 指令中唯一允许在同一文档中 多次出现的属性
Content-Type响应报头表明发送到客户程序的文档的MIME类型,servlet默认MIME类型为text/plain,jsp页面默认的MIME类型是text/html(默认字符集为ISO-8859-1)可以出现在页面的任何地方contentType="application/vnd.ms-excel"为excel表格
<%@ page   session="true"%><%@ page   isELIgnored="false"%><%@ page   buffer="xxxkb"%><%@ page   buffer="none"%>最小8kb以上
<%@ page errorPage="url"%>指定错误页面<%@ page isErrorPage="true"%>
<jsp:include page="bios/test1.jsp" />
<jsp:include page="/bios/test1.jsp" />
<img src="bios/file">
jsp:include中以斜杠开头,则相对于web根目录,不以斜杠开头,则为相对于主页面的位置,jsp:include动作肯定不会让系统去查找当前web应用以外的文件
规则:任何时候,如果由服务器来处理,则相对与web根目录,如果由客户(浏览器)处理,则相对于服务器根目录
规则: 不要将完整的Html作为被包含页面,被包含页面只能含有适合出现在文件插入点处的html标签(servlet和jsp包含进来的是输出,不是实际代码)
jsp:include和include根本性不同:jsp:include在请求期间被激活,include指令在页面转换期间被激活
jsp:include和include主要表现在 维护和能力的差异,仅在所包含的文件中定义了主页面要用到的字段或方法,或者所包含的文件设置了主页面的响应报头时才用include指令<%@ include=""%>
仅当不存在相同id和scope的bean时才创建新对象
id、class、beanName、type、scope、param
beanName既可以指向类,也可以指向序列化bean文件
type可以创建超类,或者当bean已经存在时使用现有bean,不创建新的bean
<jsp:userBean class=""><jsp:userBean type="">
<jsp:setProperty name="entry" property="numItems"   param="numItems"/>不使用value属性,使用param指定一个输入字符串,实现由string到基本类型和包装类的自动转换
<jsp:userBean scope="">scope的属性有4个可选值:page、request、session、application
使用MVC方案的主要驱动力是将创建和操作数据的代码与表达数据的代码分离开来的愿望
过程:1定义bean来表示数据2使用servlet处理请求3填写bean4将bean存储到请求、会话或servlet上下文中5将请求转发到jsp页面6从bean中提取数据
在采用MVC方案时,servlet并不创建任何输出,输出由jsp页面完成,故servlet不会调用response.setContentType()、response.getWrite()、或out.println()
请求的属性和请求的参数与请求的报头没有任何关系request.setAttribute("key","value")
RequestDispatcher不能直接将post请求转发给常规的Html页面,将.html改为.jsp
转发请求使用RequestDispatcher的forward方法
forward:1、只在服务器上进行,不涉及网络数据流2、不会看到目的jsp地址
sendRedirect:1、发送302和location报头,需要另外的网络往返2、能看到目的jsp
el表达式可以出现在常规文本和jsp标签属性中,使用\${ 输出${
停用多个el表达式在web.xml中<jsp-property-group><url-pattern>/test/*.jsp</url-pattern><el-ignored>true</el-ignored></jsp-property-group>
停用个别页面的表达式语言<%@ page isELEnabled="false" %>
停用个别表达式语言语句:将$替换为&#36
\${1+1} is ${1+1}  输出为 ${1+1} is 2
阻止标准脚本元素的使用在web.xml中<jsp-property-group><url-pattern>/test/*.jsp</url-pattern><scription-invalid>true</scription-invalid></jsp-property-group>
表达式语言以pageContext、HttpServletRequest、HttpSession、ServletContext的次序进行搜索,也可以指定${sessionScope.user[data]}
数组记法${attribute[entyname]} 例${attay1[0]},${list[0]},${map1[key]},map也可以使用${map1.key}
如果要载入驱动程序,只需载入相应的类,驱动程序类自身的一个static代码块自动生成驱动程序的实例,并将其注册到JDBC驱动程序管理器
String oracleUrl = "jdbc:oracle:thin@"+host+":"+port+":"+dbName;
String msAccessUrl = "jdbc:odb:"+dbName;
关闭连接还会关闭对应的statement和resultset,故应先关闭resultset和statement
过程的定义:1无参过程{ call procedure_name }2仅有输入参数的过程{ call procedure_name(?,?,?...) }3仅有一个输出参数的过程{ ? = call procedure_name }4既有输出参数又有输入参数的过程{ ? call procedure_name(?,?,?...) }过程可能返回多个输出参数,且参数的索引值从输出参数开始
例:String procedure = "{ ? = call procedure1(?,?) }";
CallableStatement cstmt = conn.prepareCall(procedure);
注册输出参数的类型 cstmt.registerOutParameter(n,type);
提供输入参数的值 cstmt.setString(2,"test");cstmt.setFloat(3,100.6F);
执行存储过程    cstmt.execute();
获得输出 int value = cstmt.getInt(1); 
使用事物管理 try{conn.setAutoCommit(false);...}catch(){}finally{conn.setAutoCommit(true);}
 
HTML
如果servlet或jsp与html位于同一个服务器上,在form表单中的action属性应使用相对URL  如:action="/servlet/TestServlet"
如果光标在文本字段中,且表单中有submit按钮,用户按下回车时会提交表单,若要阻止这种行为,可以用button控件取代submit提交表单<input type="button" value="submit" onclick="submit()"/>
通过为一组单选按钮提供相同的name,表示它们属于同一个组
如果附加到按钮上的代码返回false,表单的提交会被取消。 html属性名大小写不敏感,属性值大小写敏感
Fieldset可以在外观上将表单内的控件分组