JSPServlet学习笔记


一、   Tomcat服务器

l  Apache Jakarta的开源项目

l  JSP/Servlet容器

l  默认端口:8080

1.   启动和停止

%TOMCAT_HOME%\bin

startup.bat:启动Tomcat的批处理文件

shutdown.bat:停止Tomcat服务并释放资源的批处理文件

1.        启动服务

2.        关闭此窗口就关闭了Tomcat服务

快捷键:ctrl+c

3.        有时,端口会被占用,请记住端口被占用时的异常:

严重: Catalina.stop:

java.net.ConnectException: Connection refused: connect

       at java.net.PlainSocketImpl.socketConnect(Native Method)

       at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)

       at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)

       at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)

       at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)

       at java.net.Socket.connect(Socket.java:529)

       at java.net.Socket.connect(Socket.java:478)

       at java.net.Socket.<init>(Socket.java:375)

       at java.net.Socket.<init>(Socket.java:189)

       at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:422)

       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

       at java.lang.reflect.Method.invoke(Method.java:597)

       at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:337)

       at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:415)

严重: Error initializing endpoint

java.net.BindException: Address already in use: JVM_Bind<null>:8080

       at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:509)

       at org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:176)

       at org.apache.catalina.connector.Connector.initialize(Connector.java:1058)

       at org.apache.catalina.core.StandardService.initialize(StandardService.java:677)

       at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795)

       at org.apache.catalina.startup.Catalina.load(Catalina.java:535)

       at org.apache.catalina.startup.Catalina.load(Catalina.java:555)

       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

       at java.lang.reflect.Method.invoke(Method.java:597)

       at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260)

       at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412)

2012-9-26 9:34:59 org.apache.catalina.startup.Catalina load

 

在%Tomcat_HOME%\logs目录下使用产生日志文件

4.        此时,可以使用shutdown.bat来释放端口

2.   测试Tomcat

在地址栏输入http://localhost:8080或者http://127.0.0.1:8080,如果出现如下界面就表示成功。

3.   配置Tomcat端口号

在%Tomcat_HOME%\conf目录下,使用文本编辑器打开servlet.xml,找到

<Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

将port=”8080”改成你想要的端口就行。

建议:使用大一些的数字,至少1024以后的端口。

4.   部署应用程序

二种方式:

1、 手动部署到webapps

将web应用程序拷贝到Tomcat目录下的webapps下

2、 虚拟目录

在%Tomcat_HOME%\conf目录下,使用文本编辑器打开servlet.xml,在Host标签内配置:

<Context path="/myweb" docBase="H:\2T100\jspservlet\myweb" reloadable="true" />

一个Context就代表一个Web应用程序,

path:虚拟路径

docBaseWeb程序的物理路径

reloadable:页面改变自动重新加载

二、   Web程序的目录结构

          目录

            说  明

/

Web应用的根目录,该目录下所有文件在

客户端都可以访问,包括JSP、HTML,JPG

等访问资源。

/WEB-INF

存放应用使用的各种资源,该目录及其子

目录对客户端都是不可以访问,其中包括

web.xml(部署表述符)

/WEB-INF/classes

存放Web项目的所有的class文件

/Web-INF/lib

存放Web应用使用的JAR文件

三、   在Tomcat中管理Web应用程序

点击TomcatManager

输入用户名密码

配置用户和密码

在上图中点击“取消”,出现下图:

然后修改conf/tomcat-users.xml

按上图中的格式添加用户

<user username="tomcat" password="123" roles="admin,manager" />

重新进入,输入用户名和密码

进入管理界面:

四、   在Eclipse配置Tomcat

4.1.           配置

选择windwoà首选项

选择MyEclipse

选择Servers

选择Tomcat

使用6.x的版本

l  选择Enable

l  选择Tomcat路径

l  Apply(应用)

在Server视图中可以看到新配置的Tomcat项

也可在快捷键中的配置。

选择Confing Server

打开配置窗口

4.2.           部署项目

1、 在快捷菜单中部署

打开部署窗口,选择要部署的Server

点击Add添加项目,Project下拉框会出现所以可以部署的Web项目。

2、 在Servers视图中部署

如果不到Servers视图,打开Servers视图

如果上在面的选项中看不到Servers视图选项,那么可以选择Other,在Other的窗口中选择Servers

可以通过右键菜单也可以通过Servers视图中的快捷工具来部署

4.3.           项目名与部署工程名称

1、 选择项目属性或使用快捷键Alt+回车

2、 选择MyEclipseàweb

web Context-root就是部署后的名称。注意:以”/”开头

五、   JSP (Java Server Pages)

JSP是指:

Ø  在HTML中嵌入Java脚本代码

Ø  由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本代码

Ø  然后将生成的整个页面信息返回给客户端

六、   JSP工作原理(执行流程)

Web容器处理JSP文件请求需要经过3个阶段:

Ø  翻译阶段(转译阶段)

.jsp à .java

Ø  编译阶段

.java à .class

Ø  执行阶段(运行)

运行.class

注意:第一次请求之后,Web容器可以重用已经编译好的字节码文件。所以,第一次会比较慢。

七、   JSP中的元素

Ø  静态内容

HTML内容

Ø  指令

以“<%@ ” 开始,以“%> ” 结束。

比如:<%@ include file = " Filename" %>

Ø  表达式

<%=Java表达式 %>

注意:表达式后不要加分号。

相当于out. print(表达式);

Ø  Java脚本 (Java Scriptlet)

<% Java 代码 %>

Ø  声 明

<%! 方法 %>

<%! 变量 %>

Ø  注释

<!-- 这是注释,但客户端可以查看到 -->  HTML、XML注释

<%-- 这也是注释,但客户端不能查看到 --%>  JSP注释

八、   指令

语法:<%@ 指令名 属性n="属性值n"%>

 

常用的指令

Ø  <%@ page %>

Ø  <%@ include %>

Ø  <%@ taglib %>

7.1.           page指令

Ø  通过设置内部的多个属性来定义整个页面的属性

Ø  可以使用多次

Ø  一般JSP页面中,第一行就是page指令

Ø  page指令常用属性

属性

描述

默认值

language

指定JSP页面使用的脚本语言

java也只能是java

import

通过该属性来引用脚本语言中使用到的类文件

contentType

JSP所生成的内容类型和编码

text/html; charset=GBK

pageEncoding

用来指定JSP页面所采用的编码方式

UTF-8或别的编码

isELIgnored

是否忽略EL表达式

默认为false

isErrorPage

当前JSP是否错误处理页面

默认为false

注意:只是为true时,才能JSP中使用

exception内置对象

errorPage

指定错误页面,被指定的JSP页面,

isErrorPage一定要为true

 

7.2.           include指令

可以将一些共性的内容写入一个单独的文件中,然后通过include指令引用该文件,从而降低代码的冗余问题,也便于修改共性内容

称为静态包含,它是将file属性文件指定的文件的内容直接包含。

7.3.           Java脚本(Scriptlet)

语法 :<% Java代码 %>

写在Java脚本中的代码,事实上,都是在JSP转译成.java后的同一个方法(_jspService())中的代码。

请思考:内置对象从哪来的?

7.4.           声明

语法 :<%! 变量或方法%>

注意:声明中不可以使用内置对象,请说明和记住原因。

九、   九大内置对象

在JSP的脚本中,可以直接使用的对象。

Ø  PageContext pageContext ;

Ø  HttpSession session ;

Ø  ServletContext application;

Ø  ServletConfig config ;

Ø  JspWriter out ;

Ø  Object page;

Ø  HttpServletRequest request;

Ø  HttpServletResponseresponse

Ø  Throwable exception    只有isErrorPage=”true”的页面才拥有

8.1.           page

表示当前JSP对象,就是this

8.2.           out

是一个输出流,在JSP中用于向客户端输出信息。

8.3.           requeset

Ø  request对象主要用于处理客户端请求

Ø  或者说代表了客户端一个请求

Ø  当客户端发送一个请求,Web容器就将请求内容封装成一个HttpServletRequest的对象,名叫request的内置对象。

Ø  request对象常用方法

          方法名称

            说  明

String getParameter(String name)

根据页面表单组件名称获取页面提交数据

String[ ] getParameterValues(String name)

获取一个页面表单组件对应多个值时的用户的请求数据

void setCharacterEncoding(String charset)

指定每个请求的编码,在调用getParameter( )之前进行设定,可以解决中文乱码问题

String getRemoterAddr()

返回提交请求的客户机的IP地址

8.4.           Eclipse中页面编码的异常消息:

将page指令设置成

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"

    contentType="text/html; charset=UTF-8"%>

可以解决。

8.5.           response

response对象用于响应客户请求并向客户端输出信息

1、 常用方法

void sendRedirect (String location):将请求重新定位到一个不同的URL,即页面重定向

addCookie():向客户端输出Cookie

getWrite():获得向客户端输出的输出流

setCharacterEncoding():设置响应的编码类型

setContentType():设置响应的内容类型和编码

2、 重定向和转发

response.sendRedirect("main.jsp");//重定向request.getRequestDispatcher("main.jsp").forward(request,response);    //转发

重定向:

       又称为客户端跳转

1、 请求会丢失

2、 地址会改变

转发:

       又称为服务端跳转。

1、 请求不会丢失

2、 地址栏不改变

 

转发是在服务器端发挥作用,通过forward方法将提交信息在多个页面间进行传递。

转发是在服务器内部控制权的转移,客户端浏览器的地址栏不会显示出转向后的地址

重定向是在客户端发挥作用,通过请求新的地址实现页面转向

重定向是通过浏览器重新请求地址,在地址栏中可以显示转向后的地址

关于路径:

              重定向:basePath+完整路径

              转发:/+完整路径

十、   JSP状态管理(会话跟踪)

10.1.      Cookie

Cookie是Web服务器保存在客户端的一系列文本信息。

Cookie的作用

对特定对象的追踪

统计网页浏览次数

简化登录

安全性能

容易信息泄露

常用方法

类型

方法名称

说  明

void

setMaxAge(int expiry)

设置Cookie的有效期,以秒为单位

大于0  有效时长

等于0  删除Cookie

-1和不设置 在浏览器的进程中

void

setValue(String value)

在Cookie创建后,对Cookie进行赋值

String

getName()

获取Cookie的名称

String

getValue()

获取Cookie的值

String

getMaxAge()

获取Cookie的有效时间,以秒为单位

 

    //获取客户端发送所有的Cookie

    <%

           //获取客户端发送所有的Cookie

           Cookie[] cookies = request.getCookies();

 

           if (null != cookies) {

       %>

       <table width="600" border="1">

           <tr>

              <td>

                  名称

              </td>

              <td>

                 

              </td>

              <td>

                  有效时长

              </td>

           </tr>

           <%

              for (Cookie cookie : cookies) {

           %>

           <tr>

              <td>

                  <%=cookie.getName()%>

              </td>

              <td>

                  <%=cookie.getValue()%>

              </td>

              <td>

                  <%=cookie.getMaxAge()%>

              </td>

           </tr>

           <%

              }//创建Cookie

    Cookie nameCookie = new Cookie("username", "accp");

    Cookie pwdCookie = new Cookie("password", "123");

                 

    //设置有效时长(秒)

    nameCookie.setMaxAge(60);

pwdCookie.setMaxAge(60);

                 

    //向客户端手动写入Cookie

    response.addCookie(nameCookie);

    response.addCookie(pwdCookie);

10.2.      session(会话)

会话就是浏览器与服务器之间的一次通话,包含浏览器与服务器之间的多次请求、响应过程 。

类型

方法名称

说  明

void

setAttribute(String key,Object value)

以key/value的形式保存对象值

Object

getAttribute(String key)

通过key获取对象值

int

getMaxInactiveInterval()

获取session的有效非活动时间,以秒为单位

String

getId()

获取session对象的编号

void

invalidate()

设置session对象失效

十一、    JavaBean

符合规范的Java类都是JavaBean

Ø  JavaBean的分类

n  封装数据

按照OO原则,属性与数据库表字段相对应

属性私有

public的无参的构造方法

具有public的set/get方法

n  封装业务

具有实现特定功能的方法和方法实现

通常与一个封装数据的JavaBean对应

Ø  优势

n  解决代码重复编写,减少代码冗余

n  功能区分明确,避免业务逻辑处理与页面显示处理集中在一起造成混乱

n  提高了代码的维护性

十二、    四大范围

名称

说  明

page范围

在一个页面范围内有效,通过pageContext对象访问该范围内的对象

request范围

在一个服务器请求范围内有效,与客户端请求绑定一起

session范围

在一次会话范围内容有效,在会话期间与session绑定的对象皆属于该范围

application范围

在一个应用服务器范围内有效,当应用服务启动后即创建该对象,并向所有用户所共享

十三、    Tomcat配置连接池

1、 将驱动jar包拷贝到%TOMCAT_HOME%\lib目录下

2、 打开%TOMCAT_HOME%\conf\context.xml文件,在<Context>元素下配置:

<Resource name="jdbc/books"

       auth="Container"type="javax.sql.DataSource"  maxActive="100" 

       maxIdle="30" maxWait="10000" username="scott"   password="tiger"

      driverClassName="oracle.jdbc.OracleDriver" 

     url="jdbc:oracle:thin:@192.168.3.80:1521:accp"/>

3、 在web.xml中配置(可选)

<resource-ref>

    <res-ref-name> jdbc/ pro</res-ref-name>

    <res-type> javax.sql.DataSource </res-type>

    <res-auth> Container </res-auth>

  </resource-ref>

 

4、 通过JNDI获取数据源,并从数据源得到连接

Context ic = new InitialContext();

DataSource source = (DataSource)ic.lookup("java:comp/env/jdbc/news");

Connection connection = source.getConnection();

十四、    Serlvet基础

Servlet 是一个 Java程序,是在服务器上运行以处理客户端请求并做出响应的程序。

必须实现Servlet接口。

13.1.      Servlet的生命周期

1、 客户端发出HTTP请求,默认情况下,当第一次请求Servlet时,容器创建Servlet实例。否则进入第3步。

2、 调用Servlet的init()方法进行初始化。

3、 调用Servlet的service()方法处理请求和响应。

4、 然后Servlet常驻内存,等待下一次调用。

5、 应用程序停止,调用Servlet的destroy()释放占用的资源。

注意:在整个应用程序的生命周期中,Servlet的实例只有一个。它以多线程的方式进行服务。

记住JSPServlet的生命周期及区别

13.2.      Servlet的体系结构

HttpServlet中的doGet()doPost()service()方法根据提交请求的方式(GET/POST)来调用。默认为GET

13.3.      常用API

      ServeltConfig接口

      在Servlet初始化过程中获取配置信息

      一个Servlet只有一个ServletConfig对象

      ServeltConfig接口的常用方法

方法名称

         功能描述

String getInitParameter(String name)

获取web.xml中设置的以name命名的初始化参数值

ServletContext getServletContext()

返回Servlet的上下文对象引用

      ServeltConText接口

      获取Servlet上下文

      即JSP中的application内置对象

      ServeltConText接口的常用方法

方法名称

         功能描述

ServletContext getContext(String path)

返回服务器上与指定URL相对应的ServletContext对象

void setAttribute(String name,Object obj)

设置Servlet中的共享属性

Object getAttribute(String name)

获取Servlet中设置的共享属性

      GenericServlet抽象类

      提供了Servlet与ServletConfig接口的默认实现方法

      HttpServlet继承于GenericServlet

      处理HTTP协议的请求和响应

13.4.      Servlet的配置

<!-- 注册Servlet -->

<servlet>

    <servlet-name>servlet03</servlet-name>

    <servlet-class>com.accp.jspservlet.servlet.Servlet03</servlet-class>

    </servlet>

   

    <!-- 映射 -->

<servlet-mapping>

    <servlet-name>servlet03</servlet-name>

    <url-pattern>/servlet03</url-pattern>

</servlet-mapping>  

13.5.      初始化参数

    <servlet>

       <description>读取初始化参数</description>

       <servlet-name>InitParamServlet</servlet-name>     <servlet-class>com.accp.jspservlet.servlet.InitParamServlet</servlet-class>

       <!-- 初始化参数,可以配置多个,只有该Servlet能够读取 -->

       <init-param>

           <param-name>encoding</param-name>

           <param-value>UTF-8</param-value>

       </init-param>

    </servlet>

读取:

//获取所有的初始化参数的名称

    Enumeration<String> paramNames = config.getInitParameterNames();

       while(paramNames.hasMoreElements()){

           String paramName = paramNames.nextElement();

           String paramValue = config.getInitParameter(paramName);

           System.out.println(paramName+"="+paramValue);

       }

13.6.      Servlet上下文参数

    <!-- Servlet上下文(ServletContext)参数 -->

    <context-param>

       <param-name>hello</param-name>

       <param-value>world</param-value>

    </context-param>

读取:

Enumeration<String> paramNames = context.getInitParameterNames();

       System.out.println("Servlet上下文参数,所有的Servlet都可以访问");

       while(paramNames.hasMoreElements()){

           String paramName = paramNames.nextElement();

           String paramValue = context.getInitParameter(paramName);

           System.out.println(paramName+"="+paramValue);

       }

十五、    分层开发

14.1.      为什么需要分层

JSP开发的弊端,业务处理的代码与JSP代码混在一起,不易于阅读,不易于代码维护。

分层模式是最常见的一种架构模式

分层模式是很多架构模式的基础

将解决方案的组件分隔到不同的层中

在同一个层中组件之间保持内聚性

层与层之间保持松耦合

14.2.      三层模式

表示层

业务逻辑层

数据库访问层

层与层的关系

开发原则:

l  上层依赖其下层,依赖关系不跨层

表示层不能直接访问数据访问层

上层调用下层的结果,取决于下层的实现

l  下一层不能调用上一层

l  下一层不依赖上一层

上层的改变不会影响下一层

下层的改变会影响上一层得到的结果

l  在上一层中不能出现下一层的概念

分工明确,各司其职

14.3.      MVC

原来我们开发使用JSP+JavaBean的方式,这种我们称为Model 1。

JSP+Servlet+JavaBean的方式,我们称为Model 2。是基于MVC架构的设计模式

MVC就是Model、View、Controller三个单词的缩写。表示模型——视图——控制器。

14.4.      Dao模式(Data Access Object)

n  位于业务逻辑和持久化数据之间

n  实现对持久化数据的访问

作用:

l  隔离业务逻辑代码和数据访问代码

l  隔离不同数据库的实现

组成部分:

l  DAO接口

l  DAO实现类

l  实体类

l  数据库连接和关闭工具类

Ø 只做CURD

Ø 一个方法对应数据库表的一种操作。

14.5.      业务逻辑层

一个方法对应一个业务。

只封装相关的业务。

事务应该放在业务逻辑层。(请分析为什么?)

14.6.      事务管理

参见DEMO

14.7.      commons-fileupload文件上传

参见DEMO

十六、    EL(表达式语言)

Ø  JavaBean在JSP中的局限

a)        获取JavaBean属性必须要实例化

b)       强制类型转化

Ø  使用EL表达式简化JSP开发

Ø  语法:

l  ${EL exprission }

l  ${bean.name } 或  ${ bean['name'] }:要求name属性必须要有getName()

Ø  特点:

l  自动转换类型 EL得到某个数据时可以自动转换类型

对于类型的限制更加宽松.

如果对象为null,自动转换空字符串。

l  使用简单

相比较在JSP中嵌入Java代码,EL应用更简单

Ø  作用域访问对象

属性范围

            EL中的名称

page

pageScope,例如${pageScope.username},表示在page范围内查找username变量,找不到返回Null

request

requstScope

session

sessionScope

application

applicationScope

如果不指定范围,将从小到大的范围一个个查找,找到返回。

Ø  param对象

${param.name}

Ø  获取对象集合中的数据

l  ${sessionScope.user[1]}得到集合中第二位的对象

Ø  获取对象属性

${user.name}

${user[name]}

Ø  隐式对象

对象名称

说  明

pageScope

返回页面范围的变量名,这些名称已映射至相应的值

requestScope

返回请求范围的变量名,这些名称已映射至相应的值

sessionScope

返回会话范围的变量名,这些名称已映射至相应的值

applicationScope

返回应用范围内的变量,并将变量名映射至相应的值

param

返回客户端的请求参数的字符串值

paramValues

返回映射至客户端的请求参数的一组值

pageContext

提供对用户请求和页面信息的访问

十七、    JSTL

JSTL实现JSP页面中逻辑处理

JSTL(JavaServerPages Standard TagLibrary)JSP标准标签库

第一:

使用taglib指令引入核心标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值