第九节 JSP开发模型与MVC设计模式
- 一、JSP开发模型
- 二、MVC设计模式:(Model、View、Controller)
- 三、Java web与MVC的区别
- 四、Model2实现注册功能
- 五、实现文件上传:
- 六、文件上传相关API介绍:
- 七、 **list集合中包含普通表单项与文件上传表单项**
- 八、文件上传具体代码
- 九、文件下载具体代码
一、JSP开发模型
- sun公司开发jsp技术后,也提供了jsp两种开发模型,第一种是jsp Model1,第二种是jsp Model2.
Jsp Model1. - Jsp Model1 = Jsp + JavaBean
(PS:web服务器中,jsp收集浏览器输入数据,将数据提交给JavaBean,JavaBean连接数据库进行操作,将数据返回给jsp,jsp显示在浏览器中。) - jsp负责业务操作及数据显示,JavaBean负责处理数据。
优点:简单快捷,对开发人员要求不高,应用小型web项目。
缺点:不适合比较复杂的web项目,且所有操作在jsp中完成,不便于后期项目维护与升级。 - Jsp Model2:在开发模型1基础上而来,这种开发模型添加了Servlet技术。
- Jsp Model2 = Jsp + JavaBean + Servlet
- web服务器中,
Servlet接收用户请求、处理相应(Controller),
jsp负责数据的显示(View)。
JavaBean接收Servlet处理的用户数据,之后JavaBean连接数据库进行操作(Model),将数据返回给Servlet显示在浏览器中。
优点:分层明显,便于后期代码维护和升级。开发人员可以分工合作,适合复杂的开发项目。
缺点:开发难度大,对开发人员要求较高。
二、MVC设计模式:(Model、View、Controller)
- 概述:80年代,研究中心根据功能对软件进行模块划分(分层)。三个模块:模型、视图、控制器。
- 模型:管理应用程序的业务数据、定义访问控制、修改数据的业务规则。
当模型状态发生改变时,会通知视图重新展示数据。 - 视图:负责用户交互。从模型中获取数据向用户展示,同时也将数据传递给控制器处理。
当模型里面封装的数据发生改变,视图回同步更新用户界面,目的是和模型中数据保持一致。 - 控制器:负责应用程序的用户交互部分,接收从视图传递过来的数据,并向模型发送数据。
接受用户请求(提交请求参数),响应数据。 - MVC优点:耦合性低()容易改变项目数据层和业务规则、重用性高(可以通过不同样式的试图访问同一个服务器代码)、部署快,生命周期成本低、可维护性高。
- 拓展:Java web开发的三层架构:
三成架构:web层、service层、dao层。
- web层:包含jsp,servlet,javabean的相关内容。(负责与用户交互(提交请求参数),处理请求、数据,响应数据给用户。)
- service层:称之为bussiness,作用是处理业务逻辑(转账:保障转帐前与转账后总额不变)操作、不包含web层内容
- Dao层:数据层,DataBase access Object数据库持久化对象,作用是对数据库crud操作(增删改查)。
三、Java web与MVC的区别
- Java web是分层式的开发架构,适合任何项目。
- MVC是一个设计模式,不一定适合所有项目。
- 开发前首先确定项目架构,确定后,才会确定项目采用哪种设计模式。
(PS:房子架构对应项目架构、房子的装修风格对应项目设计模式。)
四、Model2实现注册功能
- 实现:
0、准备jsp页面:resister.jsp、loginSuccess.jsp
1、准备JavaBean:UserBean:封装用户提交注册基本参数(用户名、密码、邮箱)。
2、RegisterFromBean:封装用户提交的注册参数(用户名、密码、确认密码、邮箱),进行后端代码校验.
(前端校验,校验用户输入格式正确;后端校验:校验数据库格式正确(如数据是否重复))
3、DBUtil:模拟数据库
4、注册成功,直接跳转到主页面:loginSuccess.jsp
五、实现文件上传:
- 文件上传:把本地文件上传到服务器端(服务器也需要安装到本地硬盘)
- 文件上传也是通过表单传递的,要求:
- 必须有file输入项:
<input type="file" name="filename" />
- 表单提交方式必须是post,enctype属性必须是multipart/form-data
(注:没设置enctype属性时,默认值为:application/x-www-form-urllencode)
(注:服务器端不可以使用request.getParamter的相关方法) - commons-fileupload.jar——提交参数的jar包(表单提交,enctype属性——FileItem)
commons-io.jar——获取提交参数的jar包
六、文件上传相关API介绍:
- 文件上传基本步骤:
1、创建上传项工厂对象:DiskFileUploadFactory factory = new DiskFileUploadFactory();
2、通过工厂对象的到解析器:ServletFileUpload sf = new ServletFileUpload(factory);
3、解析请求对象,得到上传表单项:List list = sf.parseRequest(request);
【注:用于将请求消息实体中的文件封装成FileItem对象的是:DiskFileItemFactory类】
七、 list集合中包含普通表单项与文件上传表单项
- FileItem接口:(常用方法)
方法一:boolean f= isFormFiled(); //如果是true,代表普通项,否则是文件上传项
方法二:String filename=getName(); //表示获取文件的名称,比如不同浏览器提交(拓展名)的不同。
方法三:String name=getFieldName(); //返回的就是表单中name的属性
方法四:write(File file); //主要应用于文件上传时,把文件保存到服务器端(服务器所安装的硬盘)
方法五:String value=getString(); //主要用于获取字符串,获取用户输入的值()
方法六:String type=getContentType(); //获取文件的MIME类型,如“image/jpeg”
方法七:boolean f=isInMemory(); //判断上传的文件存在内存中,还是临时文件中
方法八:void delete(); //文件上传完毕后,删除临时文件
方法九:InputStream in=getInputStream(); //获取上传的字节输入流
方法十:long getSize(); //获取上传文件的大小 - DiskFileItemFactory:(常用方法)
方法一:setSizeThreshold(int sizeThreshold)和getSizeThreshold()
set方法用来设置上传文件临界值
如:setSizeThreshold(1024); //如果文件上传超出了1024,就启用临时文件
方法二:setRepository(java.io.File repository)和getRepository()
当上传文化大小超出了setSizeThreshold方法设置的大小,就启用临时文件,把上传文件内容临时保存在临时文件中。 - ServletFileUpload类:(常用方法)
作用是解析Request对象,把request对象里封装的表单数据解析成表单项
方法一:List list = parseRequest(request);
方法二:setSizeMax:设置上传文件的总大小
方法三:setFileSizeMax:设置单个文件的大小
八、文件上传具体代码
- 步骤:
1、创建项目,导入jar包
2、准备上传页面:from.jsp //enctype要设置为:“multipart/from-data”
3、创建Servlet,处理上传请求:UploadServlet.Java
4、…
九、文件下载具体代码
- 文件下载:从服务器端把文件保存到本地
- 文件下载:一个流两个头
一个流:文件的字节输入流
两个头:响应头
- (Content-Type:对应文件的MIME类型,可以理解为文件的扩展名;Content-Dispostion:以下载框的方式)
- 实现文件下载:
步骤:
1、创建一个下载页面:download.jsp
2、创建一个servlet,处理下载需求:DownloadServlet - 解决下载文件名称中文乱码问题:
第一种:页面中对中文进行url编码,在DownloadServlet进行url编码。
<a href="/chapter12/DownloadServlet?filename=<%=URLEncoder.encode("文件名.jsp","utf-8")%>">文件下载</a>
/ 注:URLEncoder.ecode:编码;URLDecoder.decode:解码;
response.addHeader("ContentDisposition","attachment;filename="+URLEncoder.encode(filename,"utf-8"));
/ 注:能解决IE浏览器,不能解决火狐浏览器。
第二种:根据浏览器的不同,处理响应文件的中文乱码问题(间DownUtils工具类)
/ 处理get请求中文乱码问题:
filename = new String(Filename.getBytes("iso-8859-1"),"utf-8");
End.