美文网首页工作生活
Head First Servlet & JSP读书笔记续

Head First Servlet & JSP读书笔记续

作者: 殇不患_531c | 来源:发表于2019-07-03 23:40 被阅读0次

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类似,将<servlet-class>改成<jsp-file>即可
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)语法
非表单:

<web-app>
<login-config>
<auth-method>BASIC</auth-method>          \\or  DIGEST  or  CLIENT-CERT
</login-config>
</web-app>

表单:

<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/loginPage.html</form-login-page>
<form-error-page>/loginError.html</form-error-page>
</form-login-config>
</login-config>

在html中:

<form mehtod="POST" action="j_security_check">
<input type="text" name="j_username">
<input type="password" name="j_password">
<input type="submit" value="Enter">
</form>

3、授权:
第一步:定义角色
在开发商的部署文件中修改(如:tomcat-user.xml)

<tomcat-users>
<role rolename="Admin"/>
<role rolename="Guest"/>
<user username="Annie" password="admin" role="Admin,Guest"/>
<tomcat-users>

在web.xml中修改<security-role>

<security-role><role-name>Admin</role-name></security-role>

第二步:方法约束(对servlet和访问方式这一组合进行约束)

<security-constraint>
<web-resource-collection>
<url-pattern>/Beer/AddRecipe/*</url-pattern>
<url-pattern>/Beer/ReviewRecipe/*</url-pattern>

<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>

<auth-constraint>
<role-name>Admin<role-name>
<role-name>Guest<role-name>
</auth-constraint>
</security-constraint>

在有多种授权定义时:全禁止(有标签、没元素)>>全访问(*)>>允许访问(一个以上元素)

另外如果在程序中使用了isUserInRole(),出于统一性和规范性的考虑,必须需在再DD中再进行映射
例如

\\servlet
if(request.isUserInRole("Manage")){
\\处理页面
}


\\DD
<servlet>
<role-name>Manage<role-name>
<role-link>Admin</role-link>              \\对应部署文件中的角色名
</servlet>

3、https
在部署文件中:

<security-constraint>
<web-resource-collection>
</web-resource-collection>
<auth-constraint>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTAIL</transport-guarantee>           \\合法值有NONE(默认)、CONFIDENTAIL、INTEGRAL三种,后两者几乎一样
<user-data-constraint>
</security-constraint>

注意:需要在所有与页面有关的地方做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部署:

  <filter>
  <filter-name>BeerRequest</filter-name>
  <filter-class>wyn.BeerRequestFilter</filter-class>
  <init-param>
  <param-name>LogFileName</param-name><param-value>UserLog.txt</param-value>
  </init-param>
</filter>
<filter-mapping>
<filter-name>BeerRequest</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

其中mapping也可以使用servlet-name替代url-pattern,源码略
注意1:对转发的请求也可以使用filter过滤,但默认是不过滤

<filter-mapping>
<filter-name>BeerRequest</filter-name>
<url-pattern>*.do</url-pattern>
<!--下列dispatcher元素可选0-4个-->
<dispatcher>REQUEST  </dispatcher>        <!--客户请求进行过滤,默认使用-->
<dispatcher>FORWARD  </dispatcher>        <!--forward请求进行过滤->
<dispatcher>INCLUDE  </dispatcher>        <!--include请求进行过滤-->
<dispatcher>ERROR  </dispatcher>        <!--对错误处理的资源进行过滤-->
</filter-mapping>

注意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轻量级开发

相关文章

网友评论

    本文标题:Head First Servlet & JSP读书笔记续

    本文链接:https://www.haomeiwen.com/subject/ekehhctx.html