javaweb servlet项目

打印请求的报文:
封装请求的报文httpRequest的类,可以实现序列化,简化header的map结构的setter&getter方法。想要获取首部信息可以再封装一个getHeader()、this. header=header;
请求的报文由浏览器发送,从InputStream读取请求报文的字符串,StringBuilder request append连接字符串,do while循环,read为阻塞的方法,读完再通过split(“/r/n/r/n”)(“/r/n”)等、和for循环map结构的header,返回请求的报文,并在controller类里打印出来。
直接while循环会报空指针。

封装响应的报文:
封装响应的报文httpResponse类,可以实现序列化,简化header的map结构的setter&getter方法,给code message设置默认值,通过StringBuilder append拼接响应的报文。
都要判断有没有实体数据。

访问静态资源:
常量作为一个根目录和请求的URL作为文件的路径path,用IO流工具类的方式把静态页面读出来,作为响应的实体数据。

访问动态资源:
查询条件parameterMap封装到httpRequest类,split()、for、key value set 数据。JDBC连接数据库、Dao层sql语句插入数据、service层getkey getUserByUserName/Id查询数据库有没有这个用户,controller中调用这个方法,有user信息就把user信息以plain的形式set到响应的报文实体数据body中。

业务逻辑的抽离、接口的多实现:
根据请求的url、从容器中获取唯一的实例对象,调用子类实现的抽象方法,实现多态。
容器类:静态不可变的线程安全的map,静态代码块使用就加载这个类实现一次静态代码块,静态代码块map中key为请求的url,value为实例对象,公开的方法getKey返回实例对象。
接口和实现类:servlet接口,service抽象方法上面有。
把输出流放到response里,带着方便输出响应的页面或输出响应的报文。

用户注册的功能:
Request中get请求、条件查询以key value的形式封装在map结构的request parameterMap中,通过getkey获取username、 password通过username去dao层get user by user name查询数据库中是否有这个username,没有就再调用dao层插入该用户的数据,并返回一个注册成功的页面,否则就是有、返回一个注册失败的页面。Try catch以上的业务代码随便写个error报一个没有请求到服务器的异常500页面。
response中封装注册成功,注册失败和500页面,response也封装outputStream,把页面输出到浏览器解析内容。

post提交实现动态的页面:
form表单提交的条件查询的html中的name和value在请求的报文中是在body里。
equals方法判断请求的报文中首部信息里的Contain-Type是不是form表单提交,是再通过split()for、把值放到request的 parameterMap里,这样就可以通过getkey往数据库查数据。

实现用户登录功能:
实现登录功能的页面结构,从parameterMap里getkey去dao getuserbyusername,有user则验证password,password不一致返回错误的页面,else没有user也返回错误的页面。

用户密码校验完以后,保存登录的状态:
判断没有cookie则"set-cookie",第二次访问时,会在请求中带上cookie, cookie中保存用户信息,保存在浏览器会被拦截,不安全,最好保存在服务器,浏览器中保存的cookie是UUID随机生成的、相当于获取用户信息的一把密钥,而用户信息保存在服务器,保存在session中,可以通过cookie中保存的session ID获取。

concurrentHashMap线程安全的map:key是sessionID,value是session。getSession(sessionID) 返回session,setSession(new Session)
session extends hashMap:setAttribute(“user”,user),getAttribute(“user”)

从请求的报文中有cookie就获取cookie,通过split(“=”)获取sessionID,通过sessionID获取session,拿到session以后往session中放数据setAttribute。

获取登录的状态:
依然是request header cookie jsesstionID getSession getkey获取用户的数据,有数据获取成功,返回successful页面,如果有cookie没有session或者没有用户的数据,都重定向到登录的页面。

补充:
有三种情况需要"set-cookie":
没cookie
有cookie没sessionID
有cookie有session ID,但无法取session

引入properties配置文件:
properties文件是key value结构,key是请求、value是servlet类的全限定名。线程获取类加载器、获取资源的配置文件,
遍历entrySet、返回map里的entry,维护一个静态的不可变的线程安全的concurrenthashmap,entry. getkey把请求的资源作为key,value是用全限定名获取反射的实例。classForName()和newInstance()。

properties文件好读,但想合并所有properties文件只能用.xml格式,类似于html文件,用dom4j dom for JAVA读.xml文件里配置的内容,先到官网下载jar包,再到项目里添加依赖,直接去拷贝代码。
在这里插入图片描述
在这里插入图片描述
懒加载:使用这个类时再加载这个类。
getkey为空,通过配置文件获取全限定名,通过反射机制加载类再返回。

启动项目有bug:
请求到图片无法进行反射,报空指针异常,配置文件修改动态页面的请求,加上.do的servlet类、才对servlet类实例化,文件名也要修改。

加入过滤器:
项目加入过滤器filter,添加登录才能浏览页面的功能,未登录拦截到重定向的登录页面,而登录页面不拦截。
接口filter
抽象方法abstract methods prefilter
parameter:request response
boolean:true表示放行 false表示拦截
获取登录的cookie session
cookie getHeader(“cookie”) split(“=”)1 getSession(sessionID) get(“user”) ,有cookie有session有user返回success页面,return true,有cookie无session或无user或没有cookie 重定向到登录页面 return false。
redirection:code message location url outputStream write
拦截白名单:维护白名单的数组,add url,判断白名单数组中包含请求的string类型的url,return true 放行。

加入多个过滤器:
每一个servlet类都需要经过过滤器才能进行访问,所以,所有过滤器filter类都要加入到容器中。
.xml 文件配置要加载到容器的filter类的全限定名。
configuration 使用dom4j把配置文件的全限定名add到list中。
container foreach遍历configuration的list,把全限定名反射后的实例对象add到list中。
controller foreach遍历container中filter类的实例,调用prefilter(),返回flag。
flag是false说明没有cookie,没有登录,continue while循环。


flag: while{

}

if(!flag){
continue flag
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值