首页 > 文库大全 > 精品范文库 > 14号文库

java web 文件上传下载分析总结

java web 文件上传下载分析总结



第一篇:java web 文件上传下载分析总结

个人理解:

上传下载文件根本是对流的处理,最基础的是不使用任何框架,直接对流进行获取和解析(对request.getInputStream()进行解析处理)。

其次用一些框架进行处理,目前文件上传的(框架)组件: Apache—-fileuploadOrialiy – COS,Jsp-smart-upload。以fileupload为例,提供了工具类解析request,不需要自己去解析流。

最后是使用一些J2EE流行框架,使用框架内部封装好的来完成上传下载。这些框架大体集成了fileupload等框架,在后者基础上进一步封装,不需要处理request就获取了封装好的文件,只需处理封装后的文件就可。

Struts2使用了fileupload,Springmvc则提供了commonsmultipartresolver进行解析。

在开发过程中文件的上传下载很常用。这里简单的总结一下: 1.文件上传必须满足的条件:

a、页面表单的method必须是post 因为get传送的数据太小了 b、页面表单的enctype必须是multipart/form-data类型的 c、表单中提供上传输入域

代码细节:客户端表单中:

(如果没有这个属性,则服务端读取的文件路径会因为浏览器的不同而不同)服务端ServletInputStream is=request.getInputStream();用流的方式获取请求正文内容,进一步的解析。

2.上传文件的细节:

(1)为什么设置表单类型为:multipart/form-data.是设置这个表单传递的不是key=value值。传递的是字节码.表单与请求的对应关系:

如上可以看出在设置表单类型为:multipart/form-data之后,在HTTP请求体中将你选择的文件初始化为二进制,如上图中的Cookie之下的一串的随机字符串下的内容。但注意,在标识文件(即一串随机字符串)所分割出来的文件字节码中有两行特殊字符,即第一行内容文件头和一行空行。之后的第三行才是二进制的文件内容。所以在服务端接受客户端上传的文件时,获取HTTP请求参数中的文件二进制时,要去掉前三行。

3.自己手工解析上传的txt文件:

importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/** * 如果一个表单的类型是post且enctype为multipart/form-date * 则所有数据都是以二进制的方式向服务器上传递。* 所以req.getParameter(“xxx”)永远为null。

* 只可以通过req.getInputStream()来获取数据,获取正文的数据 * * @authorwangxi * */

publicclassUpServletextendsHttpServlet { publicvoiddoPost(HttpServletRequestreq, HttpServletResponseresp)throwsServletException, IOException { req.setCharacterEncoding(“UTF-8”);String txt = req.getParameter(“txt”);//返回的是null System.err.println(“txt is :”+txt);System.err.println(“=========================================”);InputStream in = req.getInputStream();// byte[] b= new byte[1024];// intlen = 0;

// while((len=in.read(b))!=-1){

// String s = new String(b,0,len);// System.err.print(s);// }

BufferedReaderbr = newBufferedReader(newInputStreamReader(in));String firstLine = br.readLine();//读取第一行,且第一行是分隔符号,即随机字符串

String fileName = br.readLine();//第二行文件信息,从中截取出文件名

fileName = fileName.substring(fileName.lastIndexOf(“")+1);// xxxx.txt”

fileName = fileName.substring(0,fileName.length()-1);

br.readLine();br.readLine();String data = null;//获取当前项目的运行路径

String projectPath = getServletContext().getRealPath(“/up”);PrintWriterout =newPrintWriter(projectPath+“/”+fileName);while((data=br.readLine())!=null){ if(data.equals(firstLine+“--”)){ break;} out.println(data);} out.close();} }

4.使用apache-fileupload处理文件上传:

框架:是指将用户经常处理的业务进行一个代码封装。让用户可以方便的调用。目前文件上传的(框架)组件: Apache—-fileuploadJsp-smart-upload – 200M。用fileupload上传文件: 需要导入第三方包:

Apache-fileupload.jar – 文件上传核心包。

Apache-commons-io.jar – 这个包是fileupload的依赖包。同时又是一个工具包。核心类:

DiskFileItemFactory–设置磁盘空间,保存临时文件。只是一个具类。ServletFileUpload-文件上传的核心类,此类接收request,并解析reqeust。

ServletfileUpload.parseRequest(requdest)-List 注:一个FileItem就是一个标识的开始:---------243243242342到------------------245243523452—就是一个FileItem

第一步:导入包:

第二步:书写一个servlet完成doPost方法

/** * DiskFileItemFactory构造的两个参数

* 第一个参数:sizeThreadHold-设置缓存(内存)保存多少字节数据,默认为10K * 如果一个文件没有大于10K,则直接使用内存直接保存成文件就可以了。* 如果一个文件大于10K,就需要将文件先保存到临时目录中去。* 第二个参数 File 是指临时目录位置

* */

publicclassUp2ServletextendsHttpServlet { publicvoiddoPost(HttpServletRequestreq, HttpServletResponseresp)throwsServletException, IOException { req.setCharacterEncoding(“UTf-8”);//获取项目的路径

String path = getServletContext().getRealPath(“/up”);//第一步声明diskfileitemfactory工厂类,用于在指的磁盘上设置一个临时目录

DiskFileItemFactory disk = newDiskFileItemFactory(1024*10,new File(“/home/wang/”));//第二步:声明ServletFileUpoload,接收上面的临时目录 ServletFileUpload up = newServletFileUpload(disk);//第三步:解析request

try { List list = up.parseRequest(req);//如果就一个文件

FileItem file = list.get(0);//获取文件名,带路径

String fileName = file.getName();fileName = fileName.substring(fileName.lastIndexOf(“")+1);//获取文件的类型

String fileType = file.getContentType();//获取文件的字节码

InputStream in = file.getInputStream();//声明输出字节流

OutputStream out = newFileOutputStream(path+”/“+fileName);//文件copy

byte[] b = newbyte[1024];intlen = 0;while((len=in.read(b))!=-1){ out.write(b,0,len);} out.close();

long size = file.getInputStream().available();

//删除上传的临时文件 file.delete();//显示数据

resp.setContentType(”text/html;charset=UTf-8“);PrintWriter op = resp.getWriter();op.print(”文件上传成功
文件名:“+fileName);op.print(”
文件类型:“+fileType);op.print(”
文件大小(bytes)“+size);

} catch(Exception e){ e.printStackTrace();}

} }

5.使用该框架上传多个文件:

第一步:修改页面的表单为多个input type=”file”

“method=”post“enctype=”multipart/form-data“>

File1:
File2:

第二步:遍历list publicclassUp3ServletextendsHttpServlet { publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { request.setCharacterEncoding(”UTF-8“);String path = getServletContext().getRealPath(”/up“);//声明disk

DiskFileItemFactory disk = newDiskFileItemFactory();disk.setSizeThreshold(1024*1024);disk.setRepository(new File(”d:/a“));//声明解析requst的servlet

ServletFileUpload up = newServletFileUpload(disk);try{ //解析requst

List list = up.parseRequest(request);//声明一个list封装上传的文件的数据

List> ups = newArrayList>();for(FileItem file:list){ Map mm = newHashMap();//获取文件名

String fileName = file.getName();fileName = fileName.substring(fileName.lastIndexOf(”“)+1);String fileType = file.getContentType();InputStream in = file.getInputStream();int size = in.available();//使用工具类

FileUtils.copyInputStreamToFile(in,new File(path+”/“+fileName));mm.put(”fileName“,fileName);mm.put(”fileType“,fileType);mm.put(”size“,”“+size);

ups.add(mm);file.delete();} request.setAttribute(”ups“,ups);//转发

request.getRequestDispatcher(”/jsps/show.jsp“).forward(request, response);

}catch(Exception e){ e.printStackTrace();} } } 如上就是上传文件的常用做法。现在我们在来看看fileupload的其他查用API.判断一个fileItem是否是file(type=file)对象或是text(type=text|checkbox|radio)对象: booleanisFormField()如果是text|checkbox|radio|select这个值就是true.6.处理带说明信息的图片

publicclassUpDescServletextendsHttpServlet { publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { request.setCharacterEncoding(”UTF-8“);//可以获取中文的文件名 String path = getServletContext().getRealPath(”/up“);DiskFileItemFactory disk = newDiskFileItemFactory();disk.setRepository(new File(”d:/a“));try{ ServletFileUpload up = newServletFileUpload(disk);List list = up.parseRequest(request);for(FileItem file:list){ //第一步:判断是否是普通的表单项

if(file.isFormField()){ String fileName = file.getFieldName();//=desc

String value = file.getString(”UTF-8“);//默认以ISO方式读取数据

System.err.println(fileName+”=“+value);}else{//说明是一个文件

String fileName = file.getName();fileName = fileName.substring(fileName.lastIndexOf(”“)+1);file.write(new File(path+”/“+fileName));System.err.println(”文件名是:“+fileName);System.err.println(”文件大小是:“+file.getSize());file.delete();} } }catch(Exception e){ e.printStackTrace();} } } 7.文件上传的性能提升

在解析request获取FileItem的集合的时候,使用: FileItemIterator it=up.getItemIterator(request);

比使用 Listlist = up.parseRequest(request);

性能上要好的多。示例代码:

publicclassFastServletextendsHttpServlet {

publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { request.setCharacterEncoding(”UTF-8“);String path = getServletContext().getRealPath(”/up“);DiskFileItemFactory disk = newDiskFileItemFactory();disk.setRepository(new File(”d:/a“));try{ ServletFileUpload up = newServletFileUpload(disk);//以下是迭代器模式

FileItemIterator it= up.getItemIterator(request);while(it.hasNext()){ FileItemStream item = it.next();String fileName = item.getName();fileName=fileName.substring(fileName.lastIndexOf(”“)+1);InputStream in = item.openStream();FileUtils.copyInputStreamToFile(in,new File(path+”/“+fileName));} }catch(Exception e){ e.printStackTrace();}

} } 8.文件的下载

既可以是get也可以是post。

publicvoiddoPost(HttpServletRequestreq, HttpServletResponseresp)throwsServletException, IOException { req.setCharacterEncoding(”UTF-8“);String name = req.getParameter(”name“);//第一步:设置响应的类型

resp.setContentType(”application/force-download“);//第二读取文件

String path = getServletContext().getRealPath(”/up/“+name);InputStreamin = newFileInputStream(path);//设置响应头

//对文件名进行url编码

name = URLEncoder.encode(name, ”UTF-8“);resp.setHeader(”Content-Disposition“,”attachment;filename=“+name);resp.setContentLength(in.available());

//第三步:开始文件copy

OutputStreamout = resp.getOutputStream();byte[] b = newbyte[1024];intlen = 0;while((len=in.read(b))!=-1){ out.write(b,0,len);} out.close();in.close();}

在使用J2EE流行框架时,使用框架内部封装好的来完成上传下载更为简单: Struts2完成上传.在使用Struts2进行开发时,导入的jar包不难发现存在 commons-fileupload-1.3.1.jar 包。通过上面的学习我们已经可以使用它进行文件的上传下载了。但Struts2在进行了进一步的封装。view

username:
file:

Controller FileUploadActionextendsActionSupport { private String username;

//注意,file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件 private File file;

//提交过来的file的名字

//struts会自动截取上次文件的名字注入给该属性 private String fileFileName;//getter和setter此时为了节约篇幅省掉 @Override

public String execute()throws Exception { //保存上传文件的路径

String root = ServletActionContext.getServletContext().getRealPath(”/upload“);//获取临时文件输入流

InputStream is = newFileInputStream(file);//输出文件

OutputStreamos = newFileOutputStream(new File(root, fileFileName));//打印出上传的文件的文件名

System.out.println(”fileFileName: “ + fileFileName);

// 因为file是存放在临时文件夹的文件,我们可以将其文件名和文件路径打印出来,看和之前的fileFileName是否相同

System.out.println(”file: “ + file.getName());System.out.println(”file: “ + file.getPath());

byte[] buffer = newbyte[1024];int length = 0;

while(-1!=(length = is.read(buffer, 0, buffer.length))){ os.write(buffer);}

os.close();is.close();

return SUCCESS;} }

首先我们要清楚一点,这里的file并不是真正指代jsp上传过来的文件,当文件上传过来时,struts2首先会寻找struts.multipart.saveDir(这个是在default.properties里面有)这个name所指定的存放位置(默认是空),我们可以在我们项目的struts2中来指定这个临时文件存放位置。

如果没有设置struts.multipart.saveDir,那么将默认使用javax.servlet.context.tempdir指定的地址,javax.servlet.context.tempdir的值是由服务器来确定的,例如:假如我的web工程的context是abc,服务器使用Tomcat,那么savePath就应该是%TOMCAT_HOME%/work/Catalina/localhost/abc_,临时文件的名称类似于upload__1a156008_1373a8615dd__8000_00000001.tmp,每次上传的临时文件名可能不同,但是大致是这种样式。而且如果是使用Eclipse中的Servers里面配置Tomcat并启动的话,那么上面地址中的%TOMCAT_HOME%将不会是系统中的实际Tomcat根目录,而会是Eclipse给它指定的地址,例如我本地的地址是这样的:/home/wang/EclipseJavaCode/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/Catalina/localhost/abc/upload__1a156008_1373a8615dd__8000_00000001.tmp。Struts2完成下载.struts2的文件下载更简单,就是定义一个输入流,然后将文件写到输入流里面就行,关键配置还是在struts.xml这个配置文件里配置:

publicclassFileDownloadActionextendsActionSupport { //要下载文件在服务器上的路径 private String path;//要下载文件的文件名

private String downloadFileName;//写入getter和setter

publicInputStreamgetDownloadFile(){ return ServletActionContext.getServletContext().getResourceAsStream(path);} @Override

public String execute()throws Exception { //当前action默认在valuestack的栈顶 setDownloadFileName(xxx);return SUCCESS;} }

action只是定义了一个输入流downloadFile,然后为其提供getter方法就行,接下来我们看看struts.xml的配置文件:

attachment;fileName=”${downloadFileName}“

downloadFile

struts.xml配置文件有几个地方我们要注意,首先是result的类型,type一定要定义成stream类型_,告诉action这是文件下载的result,result元素里面一般还有param子元素,这个是用来设定文件下载时的参数,inputName这个属性就是得到action中的文件输入流,名字一定要和action中的输入流属性名字相同,然后就是contentDisposition属性,这个属性一般用来指定我们希望通过怎么样的方式来处理下载的文件,如果值是attachment,则会弹出一个下载框,让用户选择是否下载,如果不设定这个值,那么浏览器会首先查看自己能否打开下载的文件,如果能,就会直接打开所下载的文件,(这当然不是我们所需要的),另外一个值就是filename这个就是文件在下载时所提示的文件下载名字。在配置完这些信息后,我们就能过实现文件的下载功能了。

SpringMVC完成上传:

view于struts2示例中的完全一样。此出不在写出。Controller: @Controller @RequestMapping(value=”fileOperate“)publicclassFileOperateAction { @RequestMapping(value=”upload“)public String upload(HttpServletRequest request,@RequestParam(”file“)MultipartFilephotoFile){ //上传文件保存的路径

String dir = request.getSession().getServletContext().getRealPath(”/“)+”upload“;//原始的文件名

String fileName = photoFile.getOriginalFilename();//获取文件扩展名

String extName = fileName.substring(fileName.lastIndexOf(”.“));//防止文件名冲突,把名字小小修改一下

fileName = fileName.substring(0,fileName.lastIndexOf(”.“))+ System.nanoTime()+ extName;FileUtils.writeByteArrayToFile(new File(dir,fileName),photoFile.getBytes());return”success“;} }

SpringMVC完成下载:

@RequestMapping(”/download“)public String download(String fileName, HttpServletRequest request, HttpServletResponse response){ response.setCharacterEncoding(”utf-8“);response.setContentType(”multipart/form-data“);response.setHeader(”Content-Disposition“, ”attachment;fileName=“

+ fileName);try { InputStreaminputStream = newFileInputStream(new File(文件的路径);

OutputStreamos = response.getOutputStream();byte[] b = newbyte[2048];int length;while((length = inputStream.read(b))>0){ os.write(b, 0, length);}

// 这里主要关闭。

os.close();

inputStream.close();} catch(FileNotFoundException e){ e.printStackTrace();} catch(IOException e){ e.printStackTrace();} // 返回值要注意,要不然就出现下面这句错误!

//java+getOutputStream()has already been called for this response returnnull;}

另附Spring mvc的三种上传文件方法

前台:

<%@ page language=”java“contentType=”text/html;charset=utf-8“

pageEncoding=”utf-8“%>

Insert title here

采用流的方式上传文件

采用multipart提供的file.transfer方法上传文件

使用spring mvc提供的类的方法上传文件

第二篇:javaWeb总结+小结

JavaWeb B/S与C/S的区别

1,从安装上来讲,B/S只需要在服务器端安装即可,而C/S却需要每一个客户端进行安装。2,从部署上来说,B/S只需要服务器能够支持即可,而C/S却对每一个客户端的电脑提出了要求。

3,从升级,维护角度来说,B/S只需要在服务器端升级维护即可,像网易的邮箱,而C/S却是服务器更新维护一次,客户端就要下载相关的补丁才能使用 4,从安全性来讲,B/S是基于服务器的,较之C/S安全性好

5,从本质上来说,B/S是基于请求驱动的,即客户端发送一个Http请求,然后服务器进行处理之后,响应给客户端,而C/S却是基于事件驱动的,像腾讯的QQ。

6,从耦合度来讲,B/S与服务器端耦合,而C/S却是与客户端的操作系统进行耦合。但是Client/Server(从游戏的角度来讲)较之Brows/Server具有优质的画面。

Servlet的使用步骤:

1,创建一个JAVA类,存放在com.fit.servlet包中,并且此类extends HttpServlet类,才能成为一个Servlet 2,覆写doGet()和doPost()方法

3,最后,在web.xml文件中进行Servlet配置。具体的配置如下:

Servlet类名

完整的包.类名称

Servlet类名

网页访问的名称,例如/hello Servlet的生命周期,作用,并说出和CGI(Common Gateway Interface)的区别

就是指Servlet从创建出实例对象到销毁的过程。它是一个容器,负责创建实例来接受客户端的请求,并且以多线程的方式响应给客户。具体过程如下:

Servlet被服务器实例化之后,容器运行其init方法进行初始化,请求到达时运行其service方法,在此过程中仅创建一个对象,然后service方法自动调用与请求相应的doXxx方法,当服务器决定将实例进行销毁时,再调用其destroy方法。

与CGI(通用网关接口)的区别在于,Servlet处于服务器进程中,它通过多线程的方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每一个请求都产生新的进程,服务完成后就销毁,所以效率低于Servlet 作用:可以用来进行接收客户端的请求,也可以进行请求流的控制。

Http协议:(了解)

首先它是(Hypertext Transfer Protocol)超文本传输协议。

HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。请求报文格式如下:

请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体

请求行以方法字段开始,后面分别是 URL 字段和 HTTP 协议版本字段,并以 CRLF 结尾。

应答报文格式如下:

状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体

状态码元由3位数字组成,表示请求是否被理解或被满足。原因分析是对原文的状态码作简短的描述,状态码用来支持自动操作,而原因分析用来供用户使用。客户机无需用来检查或显示语法。工作流程:

一次HTTP操作称为一个事务,其工作过程可分为四步:

首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。

建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客 户机与服务器断开连接。

Javascript的作用:

1,进行验证(通过正则表达式,在css+HTML的部分特性进行浏览器端的格式验证工作)

2,进行交互(将客户端的一个请求通过JavaScript可以发送到服务器端,也可以在浏览器端进行人机的交互,突破了以前静态页面的交互性限制)3,进行特效的处理,如走马灯,时间时钟。

Servlet生命周期:(详细)是指Servlet实例从被创建到其消失(对象销毁,回收)中间的时间及各个阶段,称之为Servlet生命周期。

前提:web服务器加载类。之后执行以下过程:

1,实例化:Servlet容器创建Servlet实例,具体就是当接收到客户端的第一次请求时,Servlet容器负责创建Servlet的一个实例。且在此过程中仅创建一个实例,通过多线程的方式响应客户端的请求

2,初始化:该容器调用init()方法。

3,服务:当请求到达时,该Servlet容器自动调用server()方法,根据客户端发送请求的方式,选择doXxx()方法执行

4,销毁:当web服务器被卸载的时候,调用destroy()方法进行对象的销毁。请看以下的一段代码: package com.fit.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Test extends HttpServlet { private static final long serialVersionUID = 1L;

public Test(){

super();

System.out.println(“===========================”);

} public void destroy(){

System.out.println(“对象被销毁!”);} public void init()throws ServletException {

System.out.println(“对象初始化!”);} protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

System.out.println(“get方法执行”);} protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

this.doGet(request, response);} protected void service(HttpServletRequest arg0, HttpServletResponse arg1)

throws ServletException, IOException {

System.out.println(“服务开始启动了!”);

super.service(arg0, arg1);}

}运行效果如下:

=========================== 对象初始化!服务开始启动了!

get方法执行

2011-7-19 12:07:04 org.apache.catalina.core.StandardContext reload 信息: Reloading this Context has started 对象被销毁!

分析原因:

1,实例化对象发生在客户端请求第一次到达的时候,而不是类被加载的时候。2,对象只被实例化一次.3,如果service()被覆写的话,则调用的时候加入super.service(arg0, arg1);这句话时候才可以清楚的调用的doXxx()方法,如果不加入此句话,那么将不会执行doGet()方法。所以一般不要覆写service()方法。只需要覆写doGet()和doPost()方法。

4,当web服务器被卸载的时候,将执行destroy()方法。进行对象的销毁!

Jsp页面构成元素,Jsp跟Html的区别,优势

Jsp定义:(Java Server Page)Java服务器端语言,组成如下: 1,静态模板:由HTML,css,JavaScript等元素构成。

2,指令:设定网页元素的属性,用于提供这个歌JSP网页的相关信息。

3,脚本元素--声明:<%!...%>,在此之中可以进行变量,常量的定义,类,方法都可以声明,但是一般不用。

4,脚本元素--Java脚本:<%...%>,在此期间可以进行Java代码的拼写。5,脚本元素--表达式:<%=..%>,用于表达式输出时使用。

6,动作:利用JSP动作可以重用JavaBean组件,可以动态的包含页面,也可以进行服务器端的跳转(即将用户的请求转发给其他的页面)。7,注释:

--HTML注释:,此种注释可以在页面中看到,成为客户端注释。--Jsp注释:<%----%>,此种注释在页面中看不到,也成为服务器端注释。--Java注释:

单行注释:// 多行注释:/*„„„*/ Jsp优点:使用HTML,CSS等技术构建页面的模板部分,用Java语言根据用户的输入动态生成可变的内容部分。既可以实现HTML控制页面布局,也亦可以实现Servlet的功能,实现了内容与表示分离。Jsp的常见指令,并说出静态包含和动态包含的区别

Page指令:<%@ page language=”java” import=” 完整的包.类名称” autoFlush=”true[false]” errorPage=”文件名” isErrorPage=”false[true]” isThreadSafe(设置是否能多线程使用)contentType=”text/html;charset=ISO-8859-1” %> 包含指令:<%@ include file=”文件名”%> taglib指令:此指令用于在Jsp页面中引入用户自定义的标签库。例如: <@% taglib url=http://java.sun.com/jsp/jstl/core prefix=”c”%> 静态包含跟动态包含的区别:

<%@ include file=”文件名%>,此包含属于静态包含,是指先将文件包含进来然后在进行编译,编译后生成的class文件中,被包含的文件在静态块中。且此种包含不允许带参数。

此种包含属于动态包含,先解释再包含进来结果,即只有在客户端进行请求时才会被动态的编译载入,在生成的class类中,它被请求一次就被创建一次。且此种被包含页面可以取得包含它的页面的参数。

Jsp常见的动作,调用JavaBean相关:

,调用此动作,可以用于实例化JavaBean,或者定位一个已经存在的JavaBean的实例,并把实例的引用赋给一个变量。

,通过这个动作可以取得JavaBean对象的属性

或者通过此动作,可以用来设置JavaBean的简单属性和索引属性,此动作的name属性必须与总的id属性相匹配。当JavaBean的属性名与请求参数名相同的情况下,可以使用property=“*”的方式为多个JavaBean的属性同时赋值,如: jsp页面通信:

:此动作用来在当前Jsp包含动态和静态文件的输出结果,可以和配合使用,向嵌入的Jsp页面传递参数

:此动作用来从当前Jsp页面转向其他页面,并传递Request对象,response对象,该标签后面的代码将不会被执行。Jsp的内置对象,四种作用域的通信对象的范围

输入/输出对象

request:表示客户端对网页的请求

response:用于处理Jsp生成的响应,使用Http协议将响应发送给客户端。

out:表示从response中取得的输出流。常用的方法有write(),print(),println()等,用于在页面中输出文本形式的响应内容 作用域通信对象

pageContext:此通信对象的作用域仅在当前页面有效,一旦跳转则不可用

request:此通信对象的作用域针对的同一个客户的请求,如果不是同一个请求则不可以使用

session:此通信对象的作用域适用于一次会话,即打开的同一个浏览器的所有页面都可以适用

application:此通信对象的作用域适用于基于WEB服务器的所有会话,适用于监听器 Servlet对象

page:指向当前Jsp页面经过转译(jsp.java文件),编译(.java文件.class文件)后的对象本身,即编译后的Servlet对象本身

config:是在一个Servlet初始化时,服务器向它传递的初始化信息。初始化信息可以在web.xml中找到。错误对象

execption:表示Jsp页面运行时抛出的异常对象,可以在专门准备的错误处理页面中访问这个异常对象。

Jsp执行过程:

jsp文件转译:当客户端请求一个正确的Jsp文件时,将Jsp—>.java文件(即将Jsp文件翻译成相应的Servlet类的源文件)编译:.java文件.class文件,即将Servlet类的源文件进行编译成为.class的Servlet文件。调用Servlet的service()方法响应用户的请求。

描述Jsp和Servlet的区别,共同点,各自的应用范围:

1,从发展上来看,Jsp可以避开Servlet的输出页面的繁琐步骤,它集合了HTML和Servlet的优点。

2,从本质上来说,Jsp是Servlet的扩展,它是Servlet的简易形式。Jsp经过转译之后就成为了类Servlet。

3,从创建方式上来说:Jsp由HTML代码和JSP标签构成,而Servlet则完全是由程序代码构成擅长于流程控制和事务处理的类

4,从使用角度来说:在MVC中,Jsp担任的是VIEW层,侧重于视图,而Servlet则充当的控制层,侧重于控制逻辑。请求转发和重定向

 response.sendRedirect():利用response对象向客户端发回一个响应指示其访问其他URL资源,或者说是一个web组件向另一个web组件发送一个新的请求,属于重定向,地址栏有变化。且不可以传递属性request参数,当所有的代码执行完之后才进行重定向。

request.getRequestDispatcher().forword(req,resp):web组件将一个请求转发给另一个web组件,他们始终是同一个请求,在此期间可以传递request属性参数,地址栏没有变化。且一执行到此代码处,后边的将不再执行

JavaBean的组成:

类必须是具体的,公共的。提供无参数的构造方法

提供getter()和setter()方法访问它的属性。版权所有@杨肖飞yangxf159371@126.com

第三篇:javaweb

html

软件的结构:

C/S(Client Server)结构的软件:

cs结构的软件的缺点:更新的时候需要用户下载更新包然后再安装,程序员则

比如: QQ、极品飞车、飞信、迅雷

需要开发客户端与服务端。

优点:软件版本升级的时候不需要用户下载更新包,直接更新服务器的程序即B/S(Browser Server)结构的软件:

比如: 微博、webQQ、web飞信、web迅雷 cs结构软件的优点: 减轻服务端的压力,而且可以大量保存数据在客户端。

可。程序员则只需要开发服务端而已。

网站的类别: 缺点:增加了服务端的压力,bs结构的软件不能保存大量的 数据在用户机上。静态网站: 静态网页中的数据都是写死的,如果需要修改网页的内容是需要直接修改网页的代码。是没有数据库提供数据给它。

动态网站: 动态网站的数据是来自于数据库的,背后是有一个后台程序管理页面中数据的。

html 语言就是开发网页的基础语言:

html(超文本标记语言)标记 : 该门语言是有标签来构成的。学习html不用怎么去理解,只要需要记

住标签的作用即可。

html语言的特点:

html语言的结构:

html语言的根标签.1.html语言是与平台无关的,任何平台只需要安装了浏览器都可以运行。2.html 是不区分大小写的。 网页的头信息

第四篇:javaweb学习课程总结

总结一:javaweb课程总结

刚开始学的时候,感觉这两门课程好高大上的样子,因为自从学软件工程这个专业以来,一直都是学的理论性、框架性的东西,就没有接触到编程的实质性的部分,终于开始学编程了,感觉蛮兴奋的,也是精神饱满,信心十足,怀着一腔热血来听课。

由于JAVAWEB和JSP两门课是同时上的,而且每次都是一整上午,上课时间很长,老师一直有条不紊的讲着,虽然时间很长,但是每当大家上完课,心中都是有一种充实的感觉,大家都觉得有所收获,所以也就不曾觉得累了。

JAVAWEB这门课让我认识了以前见所未见闻所未闻的专业术语,Web应用程序的概述。我从中了解到Web应用程序的三层体系结构:表示层、业务层、数据存取层。从而想到了学数据库设计时的数据库设计三大范式,它们同是叙述在编写代码时应做的规划和应遵循的规则,这种规划在以后的学习中时有出现,说明编程并不是一味地进行循环判断、死记硬背,而需要在技术上有所加强、在效率上有所提高。做任何事都是如此,事先必须有目标、有计划,有统筹,这样执行时才不会盲目,才不会事倍功半。学习编程对综合能力都是一种培养。

接下来是JSP知识。要学JSP,就必须会HTML,如果HTML学不通,这对以后的学习都是一个瓶颈。基础一定要打扎实,吃透,否则上层建筑的建起就不会很顺利甚至没法起步。然后是JavaBean。以下是个人对JavaBean的一点学习体会。JavaBean里有set()和get()方法,用这些方法能很容易地传值,逻辑上更标准,代码看起来也更规范。但set()和get()方法只是用来对属性进行操作的,所以如果是进行复杂的逻辑或对数据库进行操作等,那么就不要写成set()和get()方法,只用一个有返回值的方法就足以。这样直观方便,且符合规范。总之,set()和get()方法不要没有效率地滥定义。

接着是Servlet。Servlet是一个用Java编写的应用程序,在服务器上运行,用来处理请求和响应,也可以单独做为一个Web页面。然后讲的是标签,包括自定义标签和JSP标准标签库。用一般的Java代码都几乎能实现它们的功能。它们的好处是提高了代码的重用性。

我们需要配置的坏境有JDK,Tomcat,还要用到Myeclips这一基础的编程工具。在学习JSP之前,由于没有网页编程的基础,便学习了HTML这种文本标记语言,自己试着去做简单的静态网站。后来学做JSP动态网站时,就涉及到了多方面的知识,JSP内部对象及内部对象所涉及的方法,JSP与数据库连接,如何去引用数据库。这门课更是巩固了JAVA这一基础编程语言,要求对JAVA掌握的要透彻,每门语言要学扎实,深入理解,都要花费很大的功夫,不是容易的事情。

Jsp与servlet有一定的区别,Servlet可以看作是HTML的Java代码,而JSP可看作是包含Java代码的HTML。共同点:JSP和Servlet实际上是一回事。JSP页面最终要转换成Servlet,并进行编译,在请求期间执行的实际上是编译后的Servlet。因此,JSP页面不过是编写Servlet的另一种方式。各自应用的范围:Servlet比较适合于做处理任务,如做业务逻辑;JSP适合于表示任务,如网页制作,生成动态网页。

对JAVAWEB和JSP课程的知识就简单介绍到这里,本学期的这两门课程让我对软件工程这门课有了一个全新的认识,我真切的学到了能用的东西,大学里的很多课是浪费时间,而把时间花在学习这两门课上,不会觉得是在虚度光阴,相反,会有一种无比满足与充实的感觉,感谢彭老师半年以来的精心教诲,感谢这两门课给我带来快乐!

总结二:javaweb课程总结

今天老师讲的一定的程度了,发现有一些细节,自己并没有学好,如下是自己认为自己学的模糊的地方。

1.www是(worldwideweb)万维网,www的客户端程序:ie,foxfire.2.什么叫web服务器,就是一段网络程序,让人们通过浏览器可以看到任何主机上的内容(通俗的说法).3.微软开发的搜索引擎?Bing

4.B/S结构的知名缺点是什么?

受浏览器功能的限制。

C/S结构的优点,在实际中还有一部分地方需要它。如:游戏。

5.老师说再过五年就没有操作系统了,搜索引擎是未来发展的趋势。学JAVAweb就是做网站,保证以后20年活得比较滋润。

6.常见的web服务器

weblogic是bea公司

WebSphere是IBM公司

Tomcat是免费的,是Apache

7.建议使用压缩的TOMCAT的安装版,因为现实

中我们是这样用的。

8.安装tomcat的常见问题。

在这里要学习一门语言:批处理编程。打开STARTUP.BAT.1.说catalina_home没有配置

2.一安装完闪就没有了。

解决方法:

1.环境变量设置catalina。还有JAVA_HOME的配置

2.端口被占有的问题。

3.安装多个tomcat,解决方法进入当前的安装目录中双击startup.bat进入。

总结三:javaweb课程总结

我们的JSP课程终于结束。掐指算来,用一个多月的时间。这次的课程和以往的课程有一些不同。一是,需要理解的概念、专业术语很多。比如,JavaWeb里引入了Web体系结构、MVC设计模式等的概念,出现了Servlet、JavaBean、Scriptlet、JSTL等无法替代的术语;二是,这次学习的内容和Internet接轨,十分实用。比如,第四章讲解了JavaMail,这是一个用来发送接收邮件的组件。学完JSP,既复习了Java的知识,又具备了做网站的能力。

回想一下这个阶段的过程。

第一章是对Web应用程序的概述。我从中了解到Web应用程序的三层体系结构:表示层、业务层、数据存取层。从而想到了学数据库设计时的数据库设计三大范式,它们同是叙述在编写代码时应做的规划和应遵循的规则,这种规划在以后的学习中时有出现,说明编程并不是一味地进行循环判断、死记硬背,而需要在技术上有所加强、在效率上有所提高。做任何事都是如此,事先必须有目标、有计划,有统筹,这样执行时才不会盲目,才不会事倍功半。学习编程对综合能力都是一种培养。

接下来学的是JSP知识。要学JSP,就必须会HTML,如果HTML学不通,这对以后的学习都是一个瓶颈。这点我有所体会。因为我对HTML掌握得比较好,在这方面没有遇到什么困难。但如果没掌握好这些知识,加上要学新知识,就会在旧难题的基础上增加新难题,两头招架,实有些吃不消。所以,基础是很重要的,基础一定要打扎实,吃透,否则上层建筑的建起就不会很顺利甚至没法起步。

然后是JavaBean。以下是个人对JavaBean的一点学习体会。JavaBean里有set()和get()方法,用这些方法能很容易地传值,逻辑上更标准,代码看起来也更规范。但set()和get()方法只是用来对属性进行操作的,所以如果是进行复杂的逻辑或对数据库进行操作等,那么就不要写成set()和get()方法,只用一个有返回值的方法就足以。这样直观方便,且符合规范。总之,set()和get()方法不要没有效率地滥定义。

接着是Servlet。一上手,我第一个感觉是,很专业、很难懂。书上介绍了一大堆接口、类、和重写的方法,一时觉得晕头转向。后来用得多、看得多了,Servlet的基本格式也记得差不多,其实也没什么难的。只要记住Servlet是一个用Java编写的应用程序,在服务器上运行,用来处理请求和响应,也可以单独做为一个Web页面,就足够了。

在EL表达式这章,我遇到了一些困难。课后作业题完成得不顺利。但通过后面的学习,我了解到,EL表达式最大的作用是在各种标签里使用。标签以外对变量的引用,用其他方法,比如JSP表达式就能够达到目的。

然后讲的是标签,包括自定义标签和JSP标准标签库。这两章的内容不太常用。因为用一般的Java代码都几乎能实现它们的功能。它们的好处是提高了代码的重用性。标准标签库里有几个比较有用的标签,比如forTokens和setBundle,这两个标签的作用是一般代码实现不了的。

最后一章是MVC设计模式。所谓MVC,就是Model(JavaBean)、View(JSP)、Controller(Servlet),和第一章讲的Web应用程序三层体系结构相呼应。结合起来,可以这样理解。Model是数据存取层,View是表示层,Controller是业务层。用这样的规则编写网站,能做到逻辑分明,代码重用度高,便于维护等。

以上就是对这阶段学习的回顾。

通过学习JSP,我了解了更多的编程概念和理念,更增强了信心,只要有克服困难的勇气和决心,就没有什么难关无法克服。我会抱着十足的勇气和决心向下一个阶段挑战。

从一期学到现在,我对Java有了一个比较具体的认识。

Java的特点是:面向对象、跨平台、可移植。面向对象的涵义是,这种语言可以形象地模拟现实生活中的实物。在面向对象的语言中,“类”是对一组实物的共同特征描述,“对象”是类的实例,同一个类的一些对象具有类所定义的共同特点。面向对象的三大特点是“封装”、“继承”和“多态”。封装的表现有三,一是它把数据成员zǔzhīzà(因为这里被屏蔽,所以用拼音)在一起,形成一个整体;二是它可以隐藏细节,简化操作,比如,声明一个JTextField类的对象,你可以实现这个API中所有的功能,但看不到这个类的代码;你可以直接调用它的setText()、getText()等方法,而不用考虑它具体是怎么实现的。三是它可以保护数据,比如,一个类里有privateintage的属性,产生一个setAge(intageTemp)的方法,在这个方法里对传入的参数进行检验,如果不符合要求,就不对age赋值。

第五篇:JavaWeb学习总结

一、基本概念

1.1、WEB开发的相关知识

WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源。

Internet上供外界访问的Web资源分为:

1.静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变。

2.动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同。

静态web资源开发技术:Html

常用动态web资源开发技术:JSP/Servlet、ASP、PHP等

在Java中,动态web资源开发技术统称为Javaweb。1.2、WEB应用程序

WEB应用程序指供浏览器访问的程序,通常也简称为web应用。例如有a.html、b.html„..多个web资源,这多个web资源用于对外提供服务,此时应把这多个web资源放在一个目录中,以组成一个web应用(或web应用程序)

一个web应用由多个静态web资源和动态web资源组成,如:html、css、js文件,Jsp文件、java程序、支持jar包、配置文件等等。

Web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射 1.3、WEB发展史

WEB发展的两个阶段:静态、动态 1.4、静态WEB

*htm、*html,这些是网页的后缀,如果现在在一个服务器上直接读取这些内容,那么意味着是把这些网页的内容通过网络服务器展现给用户。整个静态WEB操作的过程图如下:

在静态WEB程序中,客户端使用WEB浏览器(IE、FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告诉服务器我现在需要得到哪个页面,所有的请求交给WEB服务器,之后WEB服务器根据用户的需要,从文件系统(存放了所有静态页面的磁盘)取出内容。之后通过WEB服务器返回给客户端,客户端接收到内容之后经过浏览器渲染解析,得到显示的效果。

静态WEB中存在以下几个缺点:

1、Web页面中的内容无法动态更新,所有的用户每时每刻看见的内容和最终效果都是一样的。

为了可以让静态的WEB的显示更加好看,可以加入了JavaScript以完成一些页面上的显示特效,但是这些特效都是在客户端上借助于浏览器展现给用户的,所以在服务器上本身并没有任何的变化。

实现静态WEB客户端动态效果的手段:

  JavaScript VBScript

在实际的开发中JavaScript使用得最多。

2、静态WEB无法连接数据库,无法实现和用户的交互。

使用数据库保存数据是现在大多数系统的选择,因为数据库中可以方便地管理数据,增删改查操作可以使用标准的SQL语句完成。1.5、动态WEB

所谓的动态不是指页面会动,主要的特性的是:“WEB的页面展示效果因时因人而变”,而且动态WEB具有交互性,WEB的页面的内容可以动态更新。整个动态WEB操作的过程图如下:

动态WEB中,程序依然使用客户端和服务端,客户端依然使用浏览器(IE、FireFox等),通过网络(Network)连接到服务器上,使用HTTP协议发起请求(Request),现在的所有请求都先经过一个WEB Server Plugin(服务器插件)来处理,此插件用于区分是请求的是静态资源(*.htm或者是*.htm)还是动态资源。

如果WEB Server Plugin发现客户端请求的是静态资源(*.htm或者是*.htm),则将请求直接转交给WEB服务器,之后WEB服务器从文件系统中取出内容,发送回客户端浏览器进行解析执行。

如果WEB Server Plugin发现客户端请求的是动态资源(*.jsp、*.asp/*.aspx、*.php),则先将请求转交给WEB Container(WEB容器),在WEB Container中连接数据库,从数据库中取出数据等一系列操作后动态拼凑页面的展示内容,拼凑页面的展示内容后,把所有的展示内容交给WEB服务器,之后通过WEB服务器将内容发送回客户端浏览器进行解析执行。1.6、动态WEB应用的实现手段

动态WEB现在的实现手段非常多,较为常见的有以下几种:

   Microsoft ASP、ASP.NET PHP JAVA Servlet/JSP

1、Microsoft ASP、ASP.NET

微软公司动态WEB开发是比较早的,而且最早在国内最流行的是ASP。ASP就是在HTML语言之中增加了VB脚本,但是标准的开发应用应该是使用ASP+COM,但是实际情况来看,在开发ASP的时候基本上都在一个页面中写上成百上千的代码,页面代码极其混乱。

ASP本身有开发平台的限制:Windows+IIS+SQL Server/Access,ASP只能运行在Windows操作系统上,ASP现在基本上已经淘汰,现在基本上都是使用ASP.NET进行开发,ASP.NET在性能有了很大的改善,而且开发迅速,但是依然受限于平台。ASP.NET中主要是使用C#语言。2.PHP

PHP开发速度很快,功能强大,跨平台(平台指的就是运行的操作系统),而且代码也简单。3.Servlet/JSP

这是SUN公司(SUN现在已经被Oracle公司收购)主推的B/S架构的实现语言,是基于JAVA语言发展起来的,因为JAVA语言足够简单,而且很干净。

Servlet/JSP技术的性能也是非常高的,不受平台的限制,各个平台基本上都可以使用。而且在运行中是使用多线程的处理方式,所以性能非常高。

SUN公司最早推出的WEB技术推出的是Servlet程序,Servlet程序本身使用的时候有一些问题,所有的程序是采用JAVA代码+HTML的方式编写的,即,要使用JAVA输出语句,一行一行地输出所有的HTML代码,之后,SUN公司受到了ASP的启发,发展出了JSP(Java Server Page),JSP某些代码的编写效果与ASP是非常相似的。这样可以很方便地使一些ASP程序员转向JSP的学习,加大市场的竞争力度。

二、WEB服务器 2.1、WEB服务器简介

1、Web服务器是指驻留于因特网上某种类型计算机的程序,是可以向发出请求的浏览器提供文档的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。

2、服务器是一种被动程序:只有当Internet上运行在其他计算机中的浏览器发出请求时,服务器才会响应。

2.2、常见的Web服务器介绍

1、WebLogic

WebLogic是美国bea公司出品的一个application server。BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。是目前应用最广泛的Web服务器,支持J2EE规范,而且不断的完善以适应新的开发要求,启动界面如图

2、WebSphere

WebSphere Application Server 是一种功能完善、开放的Web应用程序服务器,是IBM公司电子商务计划的核心部分,它是基于 Java 的应用环境,用于建立、部署和管理 Internet 和 Intranet Web 应用程序。这一整套产品进行了扩展,以适应 Web应用程序服务器的需要,范围从简单到高级直到企业级。启动界面如图:

3、Tomcat

TomcatTomcat是一个实现了JAVA EE标准的最小的WEB服务器,是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且开源免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。学习JavaWeb开发一般都使用Tomcat服务器,该服务器支持全部JSP以及Servlet规范,启动界面如图:

4、IIS

Microsoft的Web服务器产品为Internet Information Services(IIS),IIS 是允许在公共Intranet或Internet上发布信息的Web服务器。ⅡS是目前最流行的Web服务器产品之一,很多著名的网站都是建立在ⅡS的平台上。IIS提供了一个图形界面的管理工具,称为Internet信息服务管理器,可用于监视配置和控制Internet服务。

IIS是一种Web服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。它提供ISAPI(Intranet Server API)作为扩展Web服务器功能的编程接口;同时,它还提供一个Internet数据库连接器,可以实现对数据库的查询和更新。

学习web开发,需要先安装一台web服务器,然后再在web服务器中开发相应的web资源,供用户使用浏览器访问。

三、搭建JavaWeb应用开发环境——Tomcat服务器

3.1、疑问:学习web开发,为什么必须要先装一个WEB服务器?

在本地计算机上随便创建一个web页面,用户是无法访问到的,但是如果启动tomcat服务器,把web页面放在tomcat服务器中,用户就可以访问了。这说明什么问题?

1、不管什么web资源,想被远程计算机访问,都必须有一个与之对应的网络通信程序,当用户来访问时,这个网络通信程序读取web资源数据,并把数据发送给来访者。

2、WEB服务器就是这样一个程序,它用于完成底层网络通迅。使用这些服务器,We应用的开发者只需要关注web资源怎么编写,而不需要关心资源如何发送到客户端手中,从而极大的减轻了开发者的开发工作量。3.2、下载和安装Tomcat服务器

Tomcat官方站点:http://jakarta.apache.org

下载Tomcat安装程序包:http://tomcat.apache.org/

点击【Download】跳转到如下图所示的下载页面

1.tar.gz文件是Linux操作系统下的安装版本 2.exe文件是Windows系统下的安装版本 3.zip文件是Windows系统下的压缩版本

下载完成后,得到的是一个压缩包,将压缩包解压就可以完成Tomcat服务器的安装

将压缩包解压后,得到的就是如下图所示的文件夹,这样就完成了Tomcat服务器的安装。

3.3、启动和测试Tomcat服务器

启动Tomcat服务器

双击 bin 目录下的 startup.bat 文件启动Tomcat服务器

测试Tomcat服务器

打开浏览器,输入http://localhost:8080/,能显示如下界面代表安装成功。

3.4、Tomcat启动常见问题

导致Tomcat服务器无法正常启动的原因一般来说就是如下的两个:

1、JAVA_HOME环境变量设置问题

要想双击bin目录下的startup.bat文件启动Tomcat服务器,首先要做的就是在windows中设置JAVA_HOME环境变量,因为Tomcat服务器的启动需要用到这个JAVA_HOME环境变量,如果windows中不存在JAVA_HOME环境变量,则Tomcat服务器是无法启动的。

在Window中配置JAVA_HOME变量

操作步骤(win7系统):计算机→右键“属性”→高级系统设置→高级→环境变量,如下图所示:

点击系统变量下面的“【新建】”,弹出一个新建系统变量对话框,首先在变量名写上JAVA_HOME,顾名思义,JAVA_HOME的含义就是JDK的安装路径,然后在变量值写JDK的安装路径,如这里设置的变量值是“D:Program Files(x86)Javajdk1.7.0”,设置好变量值之后,点击【确定】按钮,JAVA_HOME环境变量就设置完成,如下图所示:系统变量中多了一个“JAVA_HOME”变量。

正常来说,学习Java开发的第一步就是配置Path环境变量,比较好的配置方式是先配置JAVA_HOME环境变量,然后在Path变量中使用“%JAVA_HOME%”引用JAVA_HOME变量的值。

所以这个JAVA_HOME环境变量在Window中一般都是已经配置好了的,如果忘记配置JAVA_HOME环境变量,那么可以使用上述的方式配置

2、端口占用问题

因为Tomcat服务器启动时是需要默认是使用8080端口的,如果这个8080端口被别的应用程序占用了,那么Tomcat服务器就无法正常启动,看到的现象就是“Tomcat服务器启动界面会打印出异常错误信息,然后就自动关闭了”,如下图所示:

由于这个窗口从启动到关闭的时间非常短,我们很难通过这个窗口看到Tomcat启动时的报错异常信息,因此我们一般只能通过Tomcat服务器的记录的log(日志)信息去查看Tomcat服务器的运行情况。

在Tomcat服务器的根目录下有一个logs文件夹,logs文件夹存放Tomcat 的日志文件,打开logs文件夹,可以看到里面的log文件,其中有一个以“catalina.yyyy-MM-dd.log”形式命名的log文件,例如“catalina.2014-05-17.log”日志文件就是记录Tomcat服务器2014-05-17这一天的运行情况。

打开catalina.2014-05-17.log文件,看看里面的日志记录信息,日志信息里面清楚的记录了Tomcat服务器的运行情况,如果因为8080端口被占用而无法正常启动,就会记录如上图所示的异常信息,通过查看异常信息,我们就可知道Tomcat服务器为什么不能够正常启动了!

总结:当Tomcat服务器无法正常启动时,首先检查是否配置了JAVA_HOME环境变量,然后再检查Tomcat服务器启动时的端口是否被别的应用程序占用了。

相关内容

热门阅读

最新更新

随机推荐