Head First Servlet & JSP读书笔记续
第七章JSP(因为时间不够以及后面要专门看JSP,这里就水过去了)
1、语法
scriptlet:<%i++;%>
指令:<%@ page import="foo.*"%>
表达式代码:<%= Counter.getCounter()%>
声明:<%!int i = 0;%><%! int doubleCount(){pass}%>
JSP注释:<%-- JSP注释 --%>
HTML注释:
EL:${applicationScope.mail}
动作:???????????
注意:使用表达式不必加分号
2、从JSP到Servlet
查看指令(指令的优先级最高,其次再就近原则)
创建HttpServlet子类
page指令的import属性 - > 声明 - > 建立服务方法,使用PrintWriter输出
3、隐式对象p298,使用pageContext操作属性p313
4、生成servlet的api
jspInit()
jspDestroy()
_jspService()
5、直接初始化JSP,即不通过servlet传入请求和响应引用——部署
和配置servlet类似,将
6、EL表达式直接从html中获得数据
7、EL绕过servlet直接向JSP发送请求
第十一章、web应用部署
1、在DD中可以做的事情:
配置欢迎页面、配置错误界面、配置servlet(url、name、初始化时间、全限定路径)、配置标签、配置安全
例子:
2、war
第十二章、web应用安全(以声明方式)
1、四大概念:认证、授权、机密性、数据完整性
2、认证:
1)四种类型:
基本(BASIC):加密安全性低
摘要(DIGEST):安全性较高,但容器或http不一定支持
客户证书(CLIENT-CERT):非常安全但客户必须有一个证书
表单(FORM):最不安全,在http请求中发回
2)语法
非表单:
BASIC \\or DIGEST or CLIENT-CERT
表单:
FORM
/loginPage.html
/loginError.html
在html中:
3、授权:
第一步:定义角色
在开发商的部署文件中修改(如:tomcat-user.xml)
在web.xml中修改
Admin
第二步:方法约束(对servlet和访问方式这一组合进行约束)
/Beer/AddRecipe/*
/Beer/ReviewRecipe/*
GET
POST
Admin
Guest
在有多种授权定义时:全禁止(有标签、没元素)>>全访问(*)>>允许访问(一个以上元素)
另外如果在程序中使用了isUserInRole(),出于统一性和规范性的考虑,必须需在再DD中再进行映射
例如
\\servlet
if(request.isUserInRole("Manage")){
\\处理页面
}
\\DD
Manage
Admin \\对应部署文件中的角色名
3、https
在部署文件中:
CONFIDENTAIL \\合法值有NONE(默认)、CONFIDENTAIL、INTEGRAL三种,后两者几乎一样
注意:需要在所有与页面有关的地方做https保护
https进一步了解。。。。。。。。。。。。。。。。。????????????
第十三章、过滤器与包装器(包装器还有别的用处??比如封装安全模块????)
1、过滤器:
本质:实现了Filter接口的java类,在DD中单独声明,进行url映射
filter类源码:
package wyn;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
@WebFilter("/BeerRequestFilter")
public class BeerRequestFilter implements Filter {
private FilterConfig fc;
public BeerRequestFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//完成一个日志功能,对用户登录进行记录
HttpServletRequest httpreq = (HttpServletRequest)request; //强转
String name = httpreq.getRemoteUser(); //得到认证用户名(见后文)
if(name!=null) {
fc.getServletContext().log("User "+name+" is updating!");
}
chain.doFilter(request, response);//调用后面的过滤器或servlet
//在调用完servlet之后才运行的代码放在这里,但一般要包装response
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
this.fc = fConfig;
}
}
DD部署:
BeerRequest
wyn.BeerRequestFilter
LogFileName UserLog.txt
BeerRequest
*.do
其中mapping也可以使用servlet-name替代url-pattern,源码略
注意1:对转发的请求也可以使用filter过滤,但默认是不过滤
BeerRequest
*.do
REQUEST
FORWARD
ERROR
注意2:过滤器调用顺序是:谁的写在上面,谁先被过滤!
技术应用:完成一个响应端过滤器压缩输出
问题1:response仍是servlet调用意味着在chain.doFilter(request, response);调用完servlet之后输出已经完成了,之后的过滤器代码对response的作用没有意义
解决方案:不将repsonse交给servlet,而是我们自己实现的响应类!
(明天再看??????????????????)
响应类(压缩包装器)代码:
压缩过滤器代码:
输出流代码:
第十四章:企业设计模式
0、软件工程原则
1、分布式web开发(JNDI RMI) ???????????????
2、MVC进阶(完成控制器的重用)
为了完成重用,必须松耦合
新的控制器伪代码:
public class ServletController extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response)
\\以声明方式调用一个表单验证组件
\\验证错误也由它处理
\\以声明方式调用一个请求处理组件
\\来调用一个模型组件
\\以声明方式分派到试图JSP
}
这实际上就是Struts!
struct学习:
表单bean:对表单元素定义getter和setter,以及验证错误处理
Action对象:处理业务逻辑,即使用模型对象。其中主要的方法execute传入表单bean,转发请求给JSP,但具体的对象实在DD中部署,完成松耦合
struts-config.xml:集成表单bean、Action对象、JSP
web.xml:配置ActionServlet,但不太懂
完结感想:
1、编程任务:压缩过滤器、hjn的网站
2、笔记还需完善
3、本书内容还是比较浅显,需要结合深刻的一起理解
4、接下来的任务:JSP、计算机网络、javaee轻量级开发