项目准备
前端页面的使用步骤
-
拷贝js和css相关的文件
-
再将list.jsp或者input.jsp拷贝到项目中
开发流程:
-
创建表
-
创建项目
标准的JavaWeb项目,根(webapp)/WEB-INF(不能通过浏览器直接访问)/classes(存放项目编译之后的文件)/lib(第三方的jar包)/web.xml(对当前项目做配置)
-
部署项目
把项目交给Tomcat服务器管理
-
创建实体类
注意属性和表中字段的映射
-
完成持久层的开发
MyBatis: 配置(主配置文件 / 映射文件----编写sql)
-
完成业务层的开发
-
完成表现层的开发
请求分发
封装参数
共享数据
页面跳转
取值显示
用户登录
登录的流程:
- 登录的表单页面,填写账号和密码,提交请求
- 在Servlet中接收账号和密码,将其传递给Service
- service接收到之后传递给DAO
- dao执行对应的SQL
select * from user where username=#{username} and password=#{password} - dao将查询的结果返回给service,service将结果返回给servlet,最后在Servlet中判断
- 如果返回值为null,说明账号或者密码错误,将错误信息告知用户,反之,将用户信息共享到Session中,跳转到主页面
代码示例
LoginServlet
EmployeeServiceImpl
EmployeeDAOImpl
EmployeeMapper
用户注销代码示例
jsp页面设计
servlet
记住我的实现
为了提升用户体验,在用户登录的时候可以选择记住账号信息,在指定之间范围内可以不用再重新填写账户信息,所以选择使用Cookie来实现。
jsp页面设计
Servlet
文件上传
文件上传:将用户本地磁盘中的文件保存到服务器中的磁盘上
实现步骤
-
创建一个表单
method:必须为post,get方式对请求参数有大小的限制(4KB左右)
enctype:表单中数据的编码方式
application/x-www-form-urlencoded:默认值,使用urlencode对数据做编码在提交到服务器
multipart/form-data:数据不做任何的编码处理,以二进制进行传输,文件上传必须使用
-
在表单中添加文件上传控件
-
在服务器端接收数据共享数据
在服务端可以直接获取到一个输入流的数据
Apache文件上传组件
使用的步骤
-
导jar包
commons-fileupload-1.2.2.jar commons-io-1.4.jar
-
实现
参考:commons-fileupload-1.2.2/site/using.html文件完成文件上传。意识:如果是第一个使用工具,建议直接拷贝实例代码,保证第一个程序成功的执行
-
解析请求
在上传组件中,将每个表单元素的数据封装在一个个的FileItem对象中
-
从FileItem对象中获取到对应的数据
文件上传的细节处理
文件名称的处理
如果用户的文件名称相同,那么后面的文件会将前面的覆盖
**解决方案:**在保存到磁盘之前,我们将文件名称重新命名(使用UUID来生成一个随机的文件名称),保证保存在服务器的文件名称不重复
文件类型的约束
用户必须传指定类型的文件,如果没有按照要求上传,将对应的错误信息告知用户
文件大小的约束
在上传文件的时候,如果文件过大,会造成服务器的压力。
如果上传文件大于文件大小的约束会报出异常
我们只需要把对应类型的异常捕获。共享错误信息,跳转到表单所在的页面,把错误信息给用户。
文件下载
文件下载:将服务器中的资源下载保存到客户机中
实现步骤:
-
将资源存放在服务器的磁盘中
-
在页面中提供下载的超链接供用户来下载
-
上面下载功能已经实现,但是文件放在WEB-INF外面,文件不安全,用户只需要拿到下载的超链接都能够下载但是在实际开发中,我们的文件通常需要用户有一定的权限才能下载所以,文件应该放在WEB-INF下。
处理中文件名称的问题
IE:URLEncoder.encode(fileName, “utf-8”)
非 IE:new String (fileName.getBytes(“utf-8”), “iso-8859-1”);
验证码
是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。
如果用户看不清验证码的图片,我们可以提供一个点击图片,切换图片的功能,用js实现
-
为图片绑定一个点击事件
-
在点击之后,执行修改图片的src属性值的操作
在路径后面加一个new Date().getTime():JS代码获取时间戳,原因:浏览器的缓存,浏览器会将get方式请求的结果缓存到本地磁盘中,在后面如果再请求相同的资源的时候,就不再发送新的请求,而是直接使用缓存中的结果,所以要欺骗浏览器,我们请求的资源不是同一个资源(实际是同一个)。
过滤器 Filter
Filter 技术是servlet 2.3 [1] 新增加的功能。
过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理,通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理。
Filter和 servlet一样也是一个Web组件,所以开发流程和Servlet一致,开发步骤:
-
定义类,实现javax.servlet.Filter接口
-
覆写其中的3个方法
-
将Filter交给Tomcat来管理(xml/注解)
<filter> <filter-name></filter-name> <filter-class></filter-class> </filter> <filter-mapping> <filter-name></filter-name> <url-pattern></url-pattern> </filter-mapping>
Servlet中的url-pattern的作用:为当前Servlet起一个资源名称,外界通过该名字找到对应的Servlet对象而Filter中的url-pattern的作用: 指定对哪些资源做过滤
Filter的生命周期
Filter从创建到销毁的整个过程
-
对象的创建
在启动服务器的时候创建所有的Filter对象
-
init方法的执行
在启动服务器的时候调用Filter对象中的init方法
-
doFilter方法的执行
每次请求对应的资源的时候都会执行
-
destroy方法的执行
正常关闭服务器的时候,执行销毁操作,非正常关闭不会执行
执行顺序:创建对象(一次)—>init方法(一次)—>doFilter方法(多次)—>destroy方法(一次/0)
FilterChain(过滤器链):
多个过滤器按照一定的顺序,排列起来。在开发中可以有多个Filter,这多个Filter组合在一起都形成一个Filter链。
程序中,存在多个过滤器的时候,过滤器的先后执行顺序由在web.xml中:配置的的先后顺序来决定。注解配置时则是由Filter的名称的字母来决定先后顺序。
监听器 Listener
web中的监听器就是对类事物的行为做监听,如果用户触发了这些事件,那么会立即执行相应的操作。web中是对作用域和作用域属性值的监听。
作用域:
ServletRequestListener:request
HttpSessionListener:session
ServletContextListener:application
作用域属性:
ServletRequestAttributeListener
HttpSessionAttributeListener
ServletContextAttributeListener
开发监听器的步骤:
- 创建一个类,实现对应的接口,如:HttpSessionListener
- 实现其中的方法
- 将监听器交给Tomcat管理