Servlet+JSP

servlet

  • servlet是Java EE规范之一
  • servlet是Javaweb三大组件之一。
    (servlet程序,filter过滤器,listener监听器)
  • 运行在服务器上的一个java小程序,它通过HTTP接受客户端发送过来的请求,并响应数据给客户端

手动实现

  1. 编写一个类去实现servlet接口
  2. 实现service方法,处理请求,并响应数据
  3. 到web.xml中去配置servlet程序的访问

servlet标签给tomcat配置servlet程序
servlet-class是servlet程序的全类名
servlet-mapping给servlet程序配置访问地址
servlet-name告诉服务器,我当前配置的地址是给哪个servlet用
url-pattern配置访问地址

1
2
3
4
5
6
7
8
<servlet>    
<servlet-name>servlet</servlet-name>   
<servlet-class>com.test.servlet</servlet-class>
</servlet><!--servlet-mapping给servlet程序配置访问地址  -->
<servlet-mapping>   
<servlet-name>servlet</servlet-name>   
<url-pattern>/hello</url-pattern>    <!--默认访问index.jsp,启动后在地址栏敲/hello就会访问到servlet这个文件-->
</servlet-mapping>

生命周期

  1. 执行servlet构造器方法
  2. 执行init初始化方法
    12在第一次访问的时候创建servlet程序会调用
  3. 执行service方法
    3每次访问都会调用
  4. 执行destroy销毁方法
    4在web工程停止的时候调用

通过继承HttpServlet

  1. 编写一个类去继承HttpServlet类
  2. 根据需要去doGet或doPost
  3. 到web.xml中的配置servlet程序的访问地址

ServletConfig类的三大作用

  1. 获取servlet程序的别名servlet-name的值
  2. 获取初始化参数init-param
  3. 获取ServletContext对象

servlet程序默认是第一次访问的时候创建,ServletConfig是每个servlet程序创建时,就创建一个对应的ServletConfig对象

JSP编程

JSP基本语法

JSP(Java server pages)将动态代码嵌入到静态的HTML中,从而产生动态的输出
JSP运行于服务器
JSP属于动态页面

  • JSP与HTML有什么区别?
  1. HTML静态页面,事先由用户写好放在服务器上,由web服务器向客户端发送

  2. JSP页面由JSP容器执行该页面的Java部分,实时生成HTML页面

    注释

  3. 能够发送给客户端,可以在源代码文件中显示

  4. 不能发送给客户端,仅提供给程序员<%–注释–%>或//注释

表达式

<%=变量/返回值/表达式%>将其里面的内容所运算的结果输出到客户端

  • 表达式不能以分号结束
  • 不能出现多条语句
  • 内容一定是字符串类型,或者能通过toString()函数转化为字符串

程序段

JSP程序段是插入到JSP程序的Java代码
用法<%Java代码%>

  • 不能在JSP程序段中定义函数
  • JSP程序可以放HTML也可以放JSP程序段和JSP表达式
  • 凡是没有被写入<% %>中的部分被解释为HTML

    JSP声明

    <%! 代码 %>
  • JSP程序段中定义的变量只能先声明后使用
  • JSP声明中定义的变量是网页级别的,系统会优先执行,即JSP声明可以在任意地方定义变量
  • JSP声明只能作定义,不能实现控制逻辑

URL传值

缺点:

  • 传输数据只能是字符串
  • 传输数据的值会在浏览器的地址栏中看到

JSP指令和动作

JSP指令告诉JSP引擎对JSP页面如何编译
<% @ 指令类别 属性1 = “属性值1”… 属性n=”属性值n” %>
包含3个指令,page,include,taglib
page指令用来设定页面的属性和相关功能

page指令的作用:

  1. 导入包<% @ page import = “包名.类名” %>
  2. 设定字符集<% @ page pageEncoding = “编码类型” %>,常见编码类型:GBK,gb2312….
  3. 设定错误页面<% @ page errorPage = “处理异常.jsp” %>抛出异常。处理异常.jsp中写<% @ page isErrorPage = “true” %>处理并将异常信息提示给用户
  4. 设定MIME类型和字符编码<% @ page contentType = “MIME类型;charset = 字符编码” %>

    include指令的作用:

插入多个外部的文件(JSP,HTML,Java程序,文本)
<% @ include file=“文件名”%>

  • 常在网页底部用来引入公司的信息
  • 引入文件和被引入文件,若由同名变量会报错

    JSP动作

    使用XML语法格式的标记来控制服务器行为
    <jsp:动作名 属性1=“属性值1”… 属性n = “属性值n” /> 或
    <jsp:动作名 属性1=“属性值1”… 属性n = “属性值n” >相关内容</jsp:动作名>
  1. jsp:include当前页面被请求的时候引入一个文件
  2. jsp:forward将请求转到另外一个页面
  3. jsp:useBean获得JavaBean的一个实例
  4. jsp:setProperty设置JavaBean属性
  5. jsp:getProperty获取JavaBean属性
  6. jsp:plugin根据浏览器的类型为Java插件生成OBJECT或EMBED两种标记
  • include动作与include指令区别

<jsp:include page="文件名"/><jsp:include page="文件名">相关标签</jsp:include>

  1. include动作只会将文件中的输出包含到JSP页面,不会有变量重名问题。include指令是将文件包含到JSP页面
  2. 动作会自动检查被包含文件的变化,指令不能
  • 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服务器,在提交过程中会出现中文乱码问题
解决:

  1. 在JSP文件中,中文无法显示。<% @ page language = "java" contentType = "text/html;charset = gb2312" %><% @ page language = "java" pageEncoding = "gb2312" %>
  2. 提交过程中出现乱码
    提交给服务器时服务器将其认成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应用进行统一的编码过滤

JSP访问数据库

JDBC-ODBC桥支持windows下的数据库连接,JDBC支持所有系统但是弹性差
JDBC操作

  1. 导包
  2. Class.forName(“驱动名”)
  3. 获取连接Connection con = DriverManager.getConnection(“URL”,”用户名”,“密码”)
  4. 创建一个实例 Statement stat = conn.createStatement();或PreparedStatement stat = conn.prepareStatement(sql);
  5. 处理sql语句。
  • stat.executeQuery(SQL语句)//查询
  • stat.executeUpdate(SQL语句)//添加,修改,删除。返回这条sql语句执行受到影响的行数
  1. 关闭数据库
  • stat.close();
  • conn.close();

游标是一个可以移动的指针,它指向一行数据,初始时指向第一行的前一行
对于将用户的输入作为插入到表中的值时,使用sql语句较为复杂。–》用PreparedStatement
Connection来定义函数的提交和事务的回滚


JSP内置对象

特点:

  • 自动载入
  • 通过Web容器来实现管理
  • 直接调用都是合法的

9种内置对象

  1. out:向客户端输出;服务器输出缓冲区的管理

  2. request:javax.servlet.http.HttpServletRequest;获取客户端的参数和流

  3. 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

  • 优点—>持久化,帮助服务器端保存多个状态信息,但是不用服务器端专门分配存储资源

  1. session:javax.servlet.http.HttpSession;跨页面保持;每一个session服务器端都有一个sessionId来标识
  2. application:javax.servlet.ServletContext;对于一个web容器所有用户共同使用一个application对象,服务器启动后会自动创建application对象,这个对象会一直保存到服务器关闭
  3. page:java.lang.Object;指向当前JSP程序本身的对象
  4. exception:java.lang.Exception;
  5. config:javax.servlet.ServletConfig;JSP程序初始化时JSP引擎向它传递信息用的
  6. pageContext:javax.servlet.jsp.PageContext;pageContext对象提供了对JSP页面种所有对象及命名空间

    总结

  7. 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="" >`