Javaweb(Tomcat、Servlet、Jsp)总结

时间:2022-06-02 19:09:42

概念:web服务器、JSP引擎/Servlet引擎等于Servlet/JSP容器

1.JSP引擎(Servlet引擎)是用来管理和运行Web应用程序的软件,而安装了JSP引擎(Servlet引擎)的计算机就是Web服务器。(Tomcat是web服务器,安装了JSP引擎(Servlet引擎))

2.Servlet/JSP容器:Tomcat可被认为是servlet容器 ,

3.Servlet容器是运行Servlet、jsp、filter等的软件环境。主要任务是创建Servlet、管理servlet的生命周期。


Servlet

一.JavaWeb开发的目录结构
1.Tomcat的管理程序
Tomcat是常见的免费的web服务器.(file:d:/test.html与http://12306.com/index.html 这样的形式的差别就是应为web服务器的差别)
.Tomcat提供另一个管理程序:manager,用于部署到Tomcat服务器中的web应用程序。
.要访问manager web应用程序,需要添加具有管理员权限的账号,编辑conf目录下的Tomcat-users.xml文件,添加manager角色,设置用户名和密码
本机为<user username="admin" password="1234" roles="manager-gui"/>
用命令行打开Tomcat方式:进入e:tolls/tomcat-6.0/tomcat6.0/bin/tomcat6


2.web程序结构
.一个web应用程序是由一组Servlet,HTML页面,类,以及其他的资源组成的运行在web服务器上的完整的应用程序,以一种结构画的层次的目录形式存在
.组成web应用程序的这些文件要部署在相应的目录层次中,根目录代表整个web应用程序的“根”
.通常将web应用程序的目录放在webapps目录下,在webapps目录下的每一个子目录都是一个独立的web应用程序,子目录的名字就是web应用程序的名字,也即是web应用程序的“根”。用户通过web应用程序的“根”来访问应用程序的资源。


3.第一个web应用程序:开发,并部署到Tomcat服务器下运行
1.在eclipse新建一个Java project
2.在Java项目下创建web开发的目录结构
-webContent
   -WEB-INF
-classes(编译后的classes文件必须放在该目录下)
-lib
-web.xml(从D:\tomcat-7.0.70\webapps\docs\WEB-INF中复制过来的)
    -html页面
    -jsp页面
    -图片
3.在src下新建一个person类
package com.atguigu.test;
public class Person{
public String getPersonInfo(){
return "person info...";
}
4.手工的将person类对应的class文件(含包)复制到classes的目录下
5.在WebContent目录下新建一个jsp文件:
<%@page import="com.atguigu.test.Person"%>
<%@page language="java" contentType="test/html;><pageEncoding="ISO-8859-1"%>

<%
Person person=new Person();
System.out.print(person.getPersonInfo());
%>
6.把webcontent目录复制到Tomcat的webapps目录下,并改名为:helloworld
7.在浏览器的地址栏中输入:http//localhost:8080/helloworld/hello.jsp即可看到命令行的打印信息
4.开发servlet



二.使用eclipse开发Javaweb项目
1.使用javaee版的eclipse开发动态的web工程(Javaweb项目)
1.把开发选项切换到Javaee
2.可以在window -> show view 中找到package Explorer,并把其拖到开发取得左边
3.在servers 面板中新建Tomcat服务器。一定要关联到Tomcat安装的目录。
4.新建一个Dynamic Web Project,期中Trager Runtime需选择Tomcat6.0
5.开发Java web应用
6.可以通过run on server来运行web项目


2.Servlet简介
.Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用servlet的方法,Servlet和客户的通信采用“请求/相应”的模式。
.Servlet可完成如下功能:
-创建并返回基于客户请求的动态HTML页面。
-创建可嵌入到现有HTML页面中的部分HTML(HTML片段)。
-与其他服务器资源(如数据库或基于Java应用程序)进行通信。


.第一个Servlet程序
1.创建一个Servlet接口的实现类
public class HelloServlet implements Servlet
2.在web.xml文件中配置和映射这个Servlet
<!--配置和映射Servlet--> 
<servlet>
<!--Servlet注册的名字-->
<servlet-name>helloServlet</servlet-name>
<--Servlet的全类名-->
<servlet-class>com.atguigu.HelloServlet</servlet-class>
</servlet>
 
<servlet-mapping>
<!--需要和上面的注册名一致-->
<servlet-name>helloServlet</servlet-name>
<!--映射具体的访问路径:/ 代表当前web应用的根目录为(http://localhost:8080/day_8-4/)-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>






三.servlet的配置及生命周期方法
1.Servlet容器:运行Servlet、jsp、filter等的软件环境。
1.可以来创建Servlet,并调用Servlet的相关生命周期方法。


2.Servler生命周期方法:以下方法都是由Servlet容器负责调用。
1.构造器:只被调用一次,只有第一次请求Servlet时,创建Servlet的实例,调用构造器。这说明Servlet是单实例的!
2.init方法:只被调用一次,在创建好实例后立即被调用,用于初始化当前Servlet。
3.service:被多次调用,每次请求都会调用service方法,实际用于响应请求的。
4.destroy:只被调用一次,在当前Servlet所在的web应用被卸载前调用,用于释放当前Servlet所占用的资源。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。


3.servlet容器响应客户请求的过程
1.Servlet引擎检查是否已经装在并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步。
2.装载并创建该Servlet的一个实例对象:调用该Servlet的构造器。
3.调用Servlet实例对象的init()方法。
4.创建一个用于封装请求的ServletRequest对象和一个代表service()方法并将请求和响应作为参数转递进去。
5.web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。


4.load-on-startup参数:
.配置在servlet节点中
<!--配置和映射Servlet--> 
<servlet>
<!--Servlet注册的名字-->
<servlet-name>helloServlet</servlet-name>
<--Servlet的全类名-->
<servlet-class>com.atguigu.HelloServlet</servlet-class>
<!--可以指定Servlet被创建的时机-->
<load-on-startup>2</load-on-startup>
</servlet>
.load-on-startup:可以指定Servlet被创建的时机。若为负数,则在第一次请求时被创建,若为0或正数,则在当前web应用被Servlet容器加载时创建实例,且数字越小越早被创建。
 


5.Servlet的注册与运行
.servlet程序必须通过servlet容器来启动运行,并且储存目录特殊要求,通需要存储在<WEB应用程序目录>\WEB-INF\classes\目录中。
.Servlet程序必须在web应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问。
.一个<servlet>元素用于注册一个Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。
.一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。


6.servlet映射的细节
.同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servler-name>子元素的设置值可以是同一个Servlet的注册名。
.在servlet映射到URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名(如html)”,另一种格式是以正斜杠(/)开头并以“/*”结尾。
注意:既带/又带扩展名的不合法






四.Java_ServletConfig对象
.ServletConfig接口的方法
(1)getInitParameterNames
(2)getInitparameter
(3)getServletNmae
(4)getServletContext


1.ServletConfig:封装了Servlet的配置信息,并且可以获取ServletContext对象
ServletContext servletContext=servletConfig.getServletContext();


(1).配置Servlet的初始化参数


代码:
<servlet>
   <servlet-name>helloServlet</servlet-name>
   <servlet-class>com.atguigu.HelloServlet</servlet-class>
   
   <!-- 配置Servlet的初始化参数 ,且该节点必须在load-on-startup节点的前面-->
   <init-param>
    <!-- 参数名 -->
    <param-name>user</param-name>
    <!-- 参数值 -->
  <param-value>root</param-value>
   </init-param>
   
   <init-param>
  <param-name>password</param-name>
  <param-value>1230</param-value>
   </init-param>
   
   <load-on-startup>0</load-on-startup>
</servlet>


(2).获取初始化参数:( http://blog.csdn.net/obguy/article/details/51984397)此网页有详细代码说明
1.getInitParameter(String name):获取指定参数名的初始化参数
  代码:String user =arg0.getInitParameter("user");  // 获取user对应的值
        System.out.println("user:"+user);


2.getInitParameterNames():获取参数名组成的Enumeration对象
         代码: Enumeration<String> names=arg0.getInitParameterNames();//获取参数名组成的Enumeration对象
        while(names.hasMoreElements()){
            String name = names.nextElement();
            String value = arg0.getInitParameter(name);
            System.out.println("name: " + name);
            System.out.println(name+":" + value);
       }


3.serlvetName():获取当前运行的servlet名称  
   代码:String serlvetName=arg0.getServletName();  
        System.out.println(serlvetName);  




2.ServletContext对象
1.可以由ServletConfig获取,
  代码:
ServletContext servletContext=servletConfig.getServletContext();


2.该对象代表当前WEB应用:可以认为ServletContext是当前web应用的一个大管家,可以从中获取到当前web应用的各个方面的信息)
.Servlet引擎为每个web应用程序都创建一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServlertcontext方法可以返回ServletContext对象的引用
.由于一个web应用程序中所有Servlet都共享同一个ServletContext对象,所以,ServletContext对象被称之为application对象(web应用程序对象)。
功能:
      *1.获取web应用程序的初始化参数
2.记录日志
3.application域范围的属性。
4.访问资源文件
5.获取虚拟路径所映射的本地路径
6.web应用程序之间的访问
· 7.ServletContext的其他方法
(1).获取当前WEB应用的初始化参数
设置初始化参数:可以为所有的Servlet所获取,而Servlet的初始化参数只能用那个Serlvet可以获取。
<!-- 配置当前web应用的初始化参数 (ServlerContext接口的学习)-->
  <context-param>
  <param-name>driver</param-name>
  <param-value>con.mysql.Driver</param-value>
  </context-param>


   方法:和下列方法一样
getInitParameter
getInitParameterNames


 代码:
     1.获取当前WEB应用的初始化参数,获取ServletContext对象
        ServletContext context1=arg0.getServletContext();
        String driver=context1.getInitParameter("driver");
        System.out.println("driver:"+driver);
        
        //打印获得的参数
        Enumeration<String> name2=arg0.getInitParameterNames();
        while(name2.hasMoreElements()) {
        String name=name2.nextElement();
        System.out.println("-->"+ name);
        }


(2).获取当前web应用的某个文件在服务器上的绝对目录,而不是部署前的物理路径
getRealPath(String Path)
代码:
      ServletContext context2 = arg0.getServletContext();
        String  path = context2.getRealPath("/hello.jsp");
System.out.println(path);


(3).获取当前WEB应用的名称:
getContextPath()
代码:
ServletContext context3=arg0.getServletContext();
String contextPath=context3.getContextPath();
System.out.println(contextPath);



(4).获取当前WEB应用的某一个文件对应的出入流
getResourceAsStream(String path):path的/为当前WEB的根目录
代码:
ServletContext context4=arg0.getServletContext();
InputStream is2=context4.getResourceAsStream("/WEB-INF/classes/jdbc.propertise");
System.out.println("2."+ is2);


(5).和attribute相关的几个方法:






第五节 http协议
1.如何在Servlet中获取请求信息:
(1).Servlet的service()方法用于应答请求:因为每次请求都会调用service()方法


public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException


ServletRequest:封装了请求信息,可以从中获取到任何的请求信息。
ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现


这两个接口的实现类都是服务器给予实现的,并在服务器调用service方法是传入。


(2)servletRequest:封装了请求信息,可以从中获取到任何的请求信息。
1.获取请求参数:
>String getParameter(String name):根据请求参数的名字,返回参数值.若请求参数有多个值时(例如CheckBox),该方法只能获取到第一个提交的值


>String[] getParametValues(String name):根据请求参数的名字,返回请求参数对应的字符串数组。

  >Enumeration getParameterNames():返回参数名对应的Enumeration对象,类似于ServletConfig(或ServletContext)的getInitParameterNames()方法.


>Map getParameterMap():返回请求参数的键值对: key :参数名,value:参数值,String 数组类型.

2.获取请求的URI:  URI:/day_8-71/loginServlet  URL:/loginServlet 
代码: HttpServletRequest httpServletRequest=(HttpServletRequest) request;

String RequestURI=httpServletRequest.getRequestURI();
System.out.println(RequestURI);//day_8-71/loginServlet


3.获取请求的方式:
代码: HttpServletRequest httpServletRequest=(HttpServletRequest) request;

String method=httpServletRequest.getMethod();
System.out.println(method);//GET

4.若是一个get请求,获取请求参数对应的那个字符串,即?后的那个字符串。(网址输入框中的字符串)
代码:
HttpServletRequest httpServletRequest=(HttpServletRequest) request;

String queryString=httpServletRequest.getQueryString();
System.out.println(queryString);//结果 user=fdf&password=dfdf&interesting=shopping

5.获取请求的Servlet的映射路径
代码:  HttpServletRequest httpServletRequest=(HttpServletRequest) request;


String servletPath=httpServletRequest.getServletPath();
System.out.println(servletPath);//结果/loginServlet


6.和attribute相关的几个方法


(3)ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现.
1.getWriter():返回PrintWriter对象,调用该对象的print()方法,将把print()中的参数值直接打印到客户的浏览器上.
代码:
PrintWriter out=response.getWriter();
out.println("hellworld....");//浏览器上出现helloworld....

2.设置响应的内容类型:response.setContentType("application/msword");


3.void sendRedirect(String location):请求的重定向。(此方法为HttpServletResponse中定义。)


2.HttpServletRequest:是ServletRequest的子接口,针对于HTTP请求所定义,里面包含了大量获取HTTP请求相关的方法。




第六节 GenaricServlet(了解)


第七节 HttpServlet


JSP

1.WHY:
JSP是简化Servlet编写的一种技术,它将Java 代码和html 语句混合在同一个文件中编写,只对网页中的动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态html页面的方式编写。


2.helloworld
新建一个jsp页面,在body结点内的<% %>即可编写Java代码。
<body>
<% 
out.println("hello jsp"); 
Date date=new Date();
System.out.println(date);
%>
</body>


3.建立对jsp的直观认识
(1)jsp页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,jsp页面的文件扩展名必须为.jsp
(2)在jsp页面中编写的Java代码需要嵌套在<% 和%>中,嵌套在<%和%>之间的Java代码称为脚本片段(Scriptlets),没有嵌套在<%和%>之间的内容被称为jsp的模板元素。
(3)jsp中的Java代码可以使用out.println语句将其他Java程序代码产生的结果字符串输出给客户端,也可以使用Syetem.out.println语句将它们打印到命令行窗口。
(4)jsp文件就像普通的HTML文件一样,它们可以放置在web应用程序中的除了web_INF及其子目录外的其他任何目录中,jsp页面的访问路径与普通html页面的访问路径形式也完全一样。
(5)在jsp页面中也可以使用一种称之为jsp表达式的元素,只需将要输出的变量或表达式直接封装在<%和%>之中,就可以向客户端输出这个变量或表达式的运算结果。在jsp表达式中嵌套的变量或表达式后面不能有分号。


4.jsp的运行原理
(1)web容器(Servlet)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给jsp引擎去处理。
(2)每个jsp页面在第一次请求被访问时,jsp引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由web容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个有jsp页面翻译成的Servlet程序。
(3)jsp规范也没有明确要求jsp中的脚本程序代码必须采用Java语言,jsp中的脚本程序代码可以采用Java语言之外的其他脚本语言来编写,但是jsp页面最终必须转换成JavaServlet程序。
(4)可以在web应用程序正式发布之前,将其中的所有jsp页面预先编译成Servlet程序。