servlet
- servlet是Java EE规范之一
- servlet是Javaweb三大组件之一。
(servlet程序,filter过滤器,listener监听器) - 运行在服务器上的一个java小程序,它通过HTTP接受客户端发送过来的请求,并响应数据给客户端
手动实现
- 编写一个类去实现servlet接口
- 实现service方法,处理请求,并响应数据
- 到web.xml中去配置servlet程序的访问
servlet标签给tomcat配置servlet程序
servlet-class是servlet程序的全类名
servlet-mapping给servlet程序配置访问地址
servlet-name告诉服务器,我当前配置的地址是给哪个servlet用
url-pattern配置访问地址
1 | <servlet> |
生命周期
- 执行servlet构造器方法
- 执行init初始化方法
12在第一次访问的时候创建servlet程序会调用 - 执行service方法
3每次访问都会调用 - 执行destroy销毁方法
4在web工程停止的时候调用
通过继承HttpServlet
- 编写一个类去继承HttpServlet类
- 根据需要去doGet或doPost
- 到web.xml中的配置servlet程序的访问地址
ServletConfig类的三大作用
- 获取servlet程序的别名servlet-name的值
- 获取初始化参数init-param
- 获取ServletContext对象
servlet程序默认是第一次访问的时候创建,ServletConfig是每个servlet程序创建时,就创建一个对应的ServletConfig对象
JSP编程
JSP基本语法
JSP(Java server pages)将动态代码嵌入到静态的HTML中,从而产生动态的输出
JSP运行于服务器
JSP属于动态页面
- JSP与HTML有什么区别?
HTML静态页面,事先由用户写好放在服务器上,由web服务器向客户端发送
JSP页面由JSP容器执行该页面的Java部分,实时生成HTML页面
注释
能够发送给客户端,可以在源代码文件中显示
不能发送给客户端,仅提供给程序员<%–注释–%>或//注释
表达式
<%=变量/返回值/表达式%>将其里面的内容所运算的结果输出到客户端
- 表达式不能以分号结束
- 不能出现多条语句
- 内容一定是字符串类型,或者能通过toString()函数转化为字符串
程序段
JSP程序段是插入到JSP程序的Java代码
用法<%Java代码%>
- JSP程序段中定义的变量只能先声明后使用
- JSP声明中定义的变量是网页级别的,系统会优先执行,即JSP声明可以在任意地方定义变量
- JSP声明只能作定义,不能实现控制逻辑
URL传值
缺点:
- 传输数据只能是字符串
- 传输数据的值会在浏览器的地址栏中看到
JSP指令和动作
JSP指令告诉JSP引擎对JSP页面如何编译
<% @ 指令类别 属性1 = “属性值1”… 属性n=”属性值n” %>
包含3个指令,page,include,taglib
page指令用来设定页面的属性和相关功能
page指令的作用:
- 导入包<% @ page import = “包名.类名” %>
- 设定字符集<% @ page pageEncoding = “编码类型” %>,常见编码类型:GBK,gb2312….
- 设定错误页面<% @ page errorPage = “处理异常.jsp” %>抛出异常。处理异常.jsp中写<% @ page isErrorPage = “true” %>处理并将异常信息提示给用户
- 设定MIME类型和字符编码<% @ page contentType = “MIME类型;charset = 字符编码” %>
include指令的作用:
插入多个外部的文件(JSP,HTML,Java程序,文本)
<% @ include file=“文件名”%>
- 常在网页底部用来引入公司的信息
- 引入文件和被引入文件,若由同名变量会报错
JSP动作
使用XML语法格式的标记来控制服务器行为
<jsp:动作名 属性1=“属性值1”… 属性n = “属性值n” /> 或
<jsp:动作名 属性1=“属性值1”… 属性n = “属性值n” >相关内容</jsp:动作名>
- jsp:include当前页面被请求的时候引入一个文件
- jsp:forward将请求转到另外一个页面
- jsp:useBean获得JavaBean的一个实例
- jsp:setProperty设置JavaBean属性
- jsp:getProperty获取JavaBean属性
- jsp:plugin根据浏览器的类型为Java插件生成OBJECT或EMBED两种标记
- include动作与include指令区别
<jsp:include page="文件名"/>
或<jsp:include page="文件名">相关标签</jsp:include>
- include动作只会将文件中的输出包含到JSP页面,不会有变量重名问题。include指令是将文件包含到JSP页面
- 动作会自动检查被包含文件的变化,指令不能
- forward动作用来实现跳转
<jap:forward page=“文件名”/>
表单开发
<form action="page.jsp"></form>
action属性来确定表单提交给哪一个页面<% String str = request.getParameter("account"); %>
page.jsp页面用request对象来获取提交的值
- 表单无name=account的表单元素,str为null
- account中没有输入,str为“”
表单提交后,信息会在地址栏显示,不安全—》加上method=”post”。将提交请求的方式由get改为post
获取单一表单元素:<% String str = request.getParameter("元素名"); %>
获取捆绑表单元素:<% String[] str = request.getParameterValues("元素名"); %>
隐藏表单
HTTP是无状态协议,在页面之间喜欢滴值时必须通过服务器。通过URL传值(不安全)
通过<input type="hidden" >
来隐藏传的值
缺点:
- 数据类型只能是字符串
- 浏览器地址栏看不到,但是客户端源代码可以看到
中文乱码问题
用户使用Tomcat服务器,在提交过程中会出现中文乱码问题
解决:
- 在JSP文件中,中文无法显示。
<% @ page language = "java" contentType = "text/html;charset = gb2312" %>
或<% @ page language = "java" pageEncoding = "gb2312" %>
- 提交过程中出现乱码
提交给服务器时服务器将其认成ISO-8859-1编码,而网页显示的是gb2312编码。
三种解决方式:- 将其转化为gb2312格式
<% String stu = request.getParameter("stu"); stu = new String(stu.getBytes("ISO-8859-1"),"gb2312"); %>
此方法必须对每一个字符进行转化,麻烦 - 直接修改requset编码
<% request.setCharacterEncoding("gb2312"); String stu = request.getParameter("stu"); %>
该方法在取出值之前设置request的编码,并且表单的提交方式应该是post。 - 利用过滤器,对整个web应用进行统一的编码过滤
- 将其转化为gb2312格式
JSP访问数据库
JDBC-ODBC桥支持windows下的数据库连接,JDBC支持所有系统但是弹性差
JDBC操作
- 导包
- Class.forName(“驱动名”)
- 获取连接Connection con = DriverManager.getConnection(“URL”,”用户名”,“密码”)
- 创建一个实例 Statement stat = conn.createStatement();或PreparedStatement stat = conn.prepareStatement(sql);
- 处理sql语句。
- stat.executeQuery(SQL语句)//查询
- stat.executeUpdate(SQL语句)//添加,修改,删除。返回这条sql语句执行受到影响的行数
- 关闭数据库
- stat.close();
- conn.close();
游标是一个可以移动的指针,它指向一行数据,初始时指向第一行的前一行
对于将用户的输入作为插入到表中的值时,使用sql语句较为复杂。–》用PreparedStatement
Connection来定义函数的提交和事务的回滚
JSP内置对象
特点:
- 自动载入
- 通过Web容器来实现管理
- 直接调用都是合法的
9种内置对象
out:向客户端输出;服务器输出缓冲区的管理
request:javax.servlet.http.HttpServletRequest;获取客户端的参数和流
response:javax.servlet.http.HttpServletResponse;响应
① response.sendRedirect()与forward
前者浏览器地址栏会变,后者不会
前者不能共享request中的数据,后者可以
forward效率更高,因为是服务器发请求,而response.sendRedirect()需要客户端重新去请求
forward只能在同一个web应用程序内的资源之间转发请求
② Cookie是一个小的文本数据,由服务端生成,发送给客户端浏览器。
response.addCookie(Cookie c)写入客户端
Cookie.setMaxAge(int second)设置Cookie存活时间
在地址栏看不到与传递参数有关的信息
危险来源于Cookie被盗取—>跨站脚本技术,通过软件窃取硬盘下的Cookie
优点—>持久化,帮助服务器端保存多个状态信息,但是不用服务器端专门分配存储资源
- session:javax.servlet.http.HttpSession;跨页面保持;每一个session服务器端都有一个sessionId来标识
- application:javax.servlet.ServletContext;对于一个web容器所有用户共同使用一个application对象,服务器启动后会自动创建application对象,这个对象会一直保存到服务器关闭
- page:java.lang.Object;指向当前JSP程序本身的对象
- exception:java.lang.Exception;
- config:javax.servlet.ServletConfig;JSP程序初始化时JSP引擎向它传递信息用的
- pageContext:javax.servlet.jsp.PageContext;pageContext对象提供了对JSP页面种所有对象及命名空间
总结
- jsp
jsp 是 java server pages,java的服务器页面。
作用: jsp的作用是为了代替Servlet程序回传html页面数据。
jsp的本质是:Servlet程序。
jsp有三种脚本:
1、声明脚本
声明脚本它可以声明jsp页面中的代码。
格式是:<%! %>
2、表达式脚本
作用: 表达式脚本的作用是在jsp页面上输出数据。
格式是:<%= %>
3、代码脚本
作用:可以在jsp页面中定义自己需要的语句。
格式是:<% %>
jsp中有三种注释:
1、html注释<!-- html注释 --> html注释翻译之后会在_jspService()方法以out.write输出到页面
2、java注释
// 单行注释 /* 多行注释 */ java的多行注释在翻译之后在翻译到servlet程序的源代码中
3、jsp注释
<%-- jsp注释 --%> jsp注释可以注掉jsp中所有内容,在jsp翻译的时候会被完全忽略掉
- jsp中的九大内置对象:
1、request
2、response
3、pageContext
4、exception
5、application
6、out输出
7、page 指向this对象,也就是jsp对象
8、session
9、servletConfig
- 四个域对象
pageContext
request
session
application
它们从小到大的顺序分别是:pageContext 、Request、Session 、application
使用的优先顺序是从小到大:pageContext 、Request、Session 、application
out和Response输出的区别。
out输出都写到out缓冲区中
response输出都写到Respnse的缓冲区中,当jsp页面中所有代码都执行完成之后。全做以下两个操作
1、执行out.flush()操作,把out缓冲区中的数据都追加到Response缓冲区中
2、执行Response的flush()操作。把Response缓冲区中的数据,都写给客户端。在jsp页面中,统一使用out来进行输出。
out.write()可以输出字符串
out.print()可以输出任意数据
jsp的常用标签
静态包含格式: `<%@ include file="">`
动态包含
格式是:`<jsp:include page="" >`
请求转发
格式是:`<jsp:forward page="" >`