今天去海淀书城看书,目的很明确,本来是想买《WCF技术剖析》的下册(2010年3月份买了上册,当时下册没出来),谁知这本书不单卖,要和上册一起卖,扫兴。

兴致减半,索性找了旁边的基本Java的书籍,看Java,主要看下Web开发,什么Struts,Spring之类的,众所周知,Java开发,往往有很多配置(当年学习Java的时候,JAVA_HOME都折腾了半天),尤其是Web的开发,那个配置文件烦人,其实这些是我们对其运行机制不了解,不知这些配置元素起了什么作用,当然刚开始的时候,我们可能只需要按照说明,配置让自己的程序能执行起来。

我还是一贯的坚持自己的原则,知道怎么做,还要知道如何去做,甚至还想知道为什么要这么做,虽然这些对我来说很难,但是总觉得有问题在心中,不舒服。

在Java中有一个东西叫做Servlet和JSP的,关于Servlet,就是一个类似C#中的Http请求的类,在里面获取了Request对象和Response对象,这两个就不陌生了吧,配置的时候常常有一个Servlet,这些其实就是通过Servlet对请求进行拦截和判断,在CXF中配置的也是如此,看来Java中的这些东西都是相通的。下面看一个例子(http://blog.csdn.net/zklxuankai/article/details/7475317):

// 30,31行得到下面JSP 中name="username"和name="password"的值

JSP部分代码:

//action所对应的Login是相对路径,要与下面web.xml的url-pattern对应的Login相同

LoginServlet的web.xmlt配置文件代码为:

<servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>com.xuankai.servlet.LoginServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/Login</url-pattern>   
</servlet-mapping>

整个流程:

当点击JSP中的submit后,则按照action对应的相对路径Login找到web.xml文件中<servlet-mapping>的<url-pattern>中的Login,

在根据<servlet-name>为Login找到<servlet>中<servlet-name>为Login的,然后生成一个LoginServlet的实例。

在Java中还经常会看到过滤器这个玩意,Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给 Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。 看一个列子吧:http://blog.csdn.net/chengweipeng123/article/details/5781171

package Filters;import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class LogOrNot implements javax.servlet.Filter {
private FilterConfig config;
private String logon_page;
private String home_page;
public void destroy() {
config = null;

}
public void init(FilterConfig filterconfig) throws ServletException {
// 从部署描述符中获取登录页面和首页的URI
config = filterconfig;
logon_page = filterconfig.getInitParameter("LOGON_URI");
home_page = filterconfig.getInitParameter("HOME_URI");
System.out.println(home_page);
if (null == logon_page || null == home_page) {
throw new ServletException("没有找到登录页面或主页");
}
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse rpo = (HttpServletResponse) response;
javax.servlet.http.HttpSession session = req.getSession();

try {
req.setCharacterEncoding("utf-8");
} catch (Exception e1) {
e1.printStackTrace();
}
String userId = (String) session.getAttribute("UserId");
String request_uri = req.getRequestURI().toUpperCase();// 得到用户请求的URI
String ctxPath = req.getContextPath();// 得到web应用程序的上下文路径
String uri = request_uri.substring(ctxPath.length()); // 去除上下文路径,得到剩余部分的路径
try {
if (request_uri.indexOf("LOGIN.JSP") == -1 && request_uri.indexOf("LOG.JSP") == -1 && userId == null)
{
rpo.sendRedirect(home_page+logon_page);
System.out.print(home_page+logon_page);
return;
}

else {
chain.doFilter(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}

}

Code Author:Jacy.

这里对上面的代码稍作解释:过滤器从配置文件中读出配置选项,一个是登陆页面的url地址,另外一个是web应用的url,之所以要这样做,是因为如果程 序中有iframe的话,登陆页面会默认在iframe中打开,因此这里将使用绝对地址进行跳转;判断语句中要将login.jsp和log.jsp排 除,因为这两个是处理登陆的页面,若不排除将出现循环重定向;检查session中的userid选项,当然也可以设置其他的,关键看session中存 的是什么了,若有,则递交给下一个过滤器,若不再有过滤器,则提交给处理页面,若未登陆,则跳转到登陆页面。

代码写好后,就需要在web应用的web.xml文件中进行配置。filter其实就是一种Servlet,因此配置方法和Servlet是一样的。代码如下:

<filter>
<filter-name>LogOrNot</filter-name>
<filter-class>Filters.LogOrNot</filter-class>
<init-param>
<param-name>LOGON_URI</param-name>
<param-value>log.jsp</param-value>
</init-param>
<init-param>
<param-name>HOME_URI</param-name>
<param-value>/model/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LogOrNot</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
Code Author:Jacy.

其中两个配置参数就对应了Java文件中使用的参数log.jsp是登陆的视图页面,/model/是当前web应用的文件夹名称。mapping里面定义了对*.jsp进行过滤,如果程序中还有其他的页面,如.do或者.action等,那么可以继续添加<filter-mapping>这个选项,其中<url-pattern>就填写*.do或者*.action即可。

这样对所有的页面都可以进行过滤。当然还可以为应用配置其他的过滤器,Tomcat容器会根据web.xml文件中的配置顺序将其设置称过滤器链挨个处理,处理到最后一个跳转到处理页面进行处理。后面会再配置一个控制权限的过滤器。

再看看JSP吧,JSP页面翻译成的Servlet继承了org.apache.jasper.runtime.HttpJspBase类,HttpJspBase类是HttpServlet的一个子类,因此JSP页面翻译成的Servlet是HttpServlet的一个孙子类。HttpJspBase类实现了javax.servlet.jsp.HttpJspPage接口中的部分方法,因此,HttpJspBase类是抽象的。

SUN公司为JSP的WEB容器开发商和JSP页面开发人员提供了一套专门应用于开发JSP程序的Java类,这套Java类被称为JSP API。HttpJspPage接口和JspPage接口属于JSP API,在HttpJspPage接口中只定义了一个_jspService方法,但它继承了JspPage接口,JspPage接口中定义了两个方法:jspInit()和jspDestroy()。

HttpJspBase的init方法调用了jspInit和_jspInit方法,destroy方法内部调用了jspDestroy和_jspDestroy方法,service方法内部调用了_jspService方法。在HttpJspBase中实现的init、service和destroy方法都被声明成了final类型。

JSP页面中的位于<%%>外面的每行和紧临<%%>两边的每段文本被转换成以这些文本作为参数的一条条out.write语句,JSP脚本片断(位于<%%>内的一段java代码)中的java代码被原封不动地搬移进了_jspService方法中的相应位置处,JSP表达式(位于<%=和%>之中的内容)则是被转换成以其中的变量或表达式作为参数的out.print语句。

JSP与Servlet的对应关系

HttpJspPage接口

servlet接口

方法说明

jspInit

init

创建实例后被调用

_jspService

service

处理请求时调用

jspDestroy

destroy

生存期结束前被调用

再来说说C#吧,说自己是一位NET程序员,觉得自己很难胜任这个称呼,虽然从大学起,就一直用NET做过一些东西,现在想想,是在可笑,那个时候的我,只求能做出来,也不仔细去细究,对很多都是一知半解,什么委托,什么Attribute,什么linq,这些也只是脑子中的一些名词而已,工作后的自己发现自己很无知,知其一不知其二,知其然不知其所以然,这个时候我才发现自己的差距,这个时候更想了解一些背后的东西,不管是C#和Java其实很多东西都是相通的,C#下没有这么多的配置,就开发WebService来说,那是很简单的,一个asmx文件加上一个WebMethod标签即可大功告成,微软培养了一批懒程序员,但是提高了效率,也许这就是鱼和熊掌不可兼得。Java可以让人能更多的了解细节,久而久之便可登堂入室,一旦成了习惯,也就会在做Java开发的时候,找配置文件,研究配置文件等。其实,万变不离其宗,从一个语言过渡到另一个语言的时候,要善于联想,这样可能事半功倍,借助搜索引擎可以大大提高效率。

在C#中,Java中,文件操作,TCP操作,字符串操作等,很多都是类似,只是类的名称有所不同而已,操作起来差别不大,学习两种语言的的时候,可以通过一种语言去学习另外一种,不知道这叫不叫举一反三,总之要学会类比,学会找出相通的和差异的,但是尽可能的知道一些运行原理,当让我更喜欢用流程图的方式将这个工作原理画出来,在我的博客中,我已经提到这个很多次,就不在这里啰嗦了。

书分为很多类,有基础入门的,有开发升级的,还有一些本质的,不知道为什么我现在喜欢看这些本质的,还有揭秘的,比如《ASP.NET本质论》,《COM本质论》等,说起来惭愧,看了这么多,往往都是看了前半部分,后半部分就抛在脑后了,看来我是一个半途而废的人,看书往往也不能坚持到底,一鼓作气的看完。

其实在市场上看到的很多书,很多都是一个模子,介绍下原理,主要对象,控件的用法,然后最后来一个综合性的例子,对于这类书,有的时候觉得看看序言就可以了,也许这是我的片面之词,看过ASP.NET的本质论,看过一个Http请求的处理流程,通过IIS,然后通过ASP.NET,里面的HTTPRuntime,HTTPContext,HTTPhandler等,流程清晰了,就知道每一个步骤该做什么,这对于开发者来说是很有好处的,因为以前忽略了这些,所以不算一个称职的程序员,不知现在亡羊补牢算不算晚。

其实可以用What和Why来总结我想说的目的,不要停留在表面和What之上。

参考资料:http://hikin.iteye.com/blog/663539

http://edu.itbulo.com/200709/119751_2.htm

http://wenku.baidu.com/view/4a570b6eb84ae45c3b358c47.html

乱想-What&Why的更多相关文章

  1. 【Babble】批量学习与增量学习、稳定性与可塑性矛盾的乱想

    一.开场白 做机器学习的对这几个词应该比较熟悉了. 最好是拿到全部数据,那就模型慢慢选,参数慢慢调,一轮一轮迭代,总能取得不错效果. 但是面对新来数据,怎么能利用已经训练好的模型,把新的信息加进去? ...

  2. 每天多一点(2016.12.04)》Javascript隐式转换

    乱想 javascript为什么需要隐式转换?如果没有会出现什么情况? 找了一圈没有看到关于这个的讨论,只好自己研究了,可能不一定正确,自行辨知. 郁闷就是郁闷在好好的,为什么要搞个隐式转换,一般来讲 ...

  3. OO中,先有对象还是先有类?

    就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,眨一下,有人会 ...

  4. OJ生成器(一)制作Online Judge前的准备和策划

    我这校区新的微机老师斗志昂扬,准备让我们这学校萎靡的信息技术竞赛重振雄风.然后有一次我半开玩笑地说建一个自己的OJ吧,老师也就鼓励我去做了. 开什么玩笑……!我可是马上要参加NOIP的人! 于是老师说 ...

  5. Javascript隐式转换

    乱想 javascript为什么需要隐式转换?如果没有会出现什么情况? 找了一圈没有看到关于这个的讨论,只好自己研究了,可能不一定正确,自行辨知. 郁闷就是郁闷在好好的,为什么要搞个隐式转换,一般来讲 ...

  6. PHP实现文件上传下载——心在忙而已

    这一周都没有写什么东西,是啊,一周时间都没有学习太多新的东西,除了开车. 妈蛋啊,天天中午去学车然后两周没有午觉的日子还是很崩溃的,加上之后工作压力带来的心忙,宝宝不开心啊. 不过,也是自己不是那么能 ...

  7. Codeforces 549B. Looksery Party[构造]

    B. Looksery Party time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  8. 【HDU】3516 Tree Construction

    http://acm.hdu.edu.cn/showproblem.php?pid=3516 题意:平面n个点且满足xi<xj, yi>yj, i<j.xi,yi均为整数.求一棵树边 ...

  9. 2014 Hangjs 见闻流水账第二天

    前言 第一天传送门: 2014 Hangjs 见闻流水账第一天 写作风格跟第一天还是一样的. Slide 每个slide我都会根据自己的理解重新命名一次,用于表达自己的第一看法,主观意见,不喜可吐槽, ...

随机推荐

  1. SSH无密码登陆问题解决

    转载 http://my.oschina.net/hunzi/blog/10687 安装好Cygwin后,SSH需要设置为无密码登陆, 首先查看是ssh还是ssh2:ls -l `which ssh` ...

  2. [LaTex]Visio文件转EPS文件[转]

    在LaTeX系统中,由于DVI 文件经常被转为PostScript 文件,所以LATEX 支持最好的是EPS 格式(Encapsulated Post-Script ,是PostScript 语言的子 ...

  3. java_object的具体使用--上帝

    就我们所知道的,java中有子类和父类,子类由于继承父类而形成,那么父类还有没有父类呢?答案是有了,父类的父类就是object类,一切父类都继承了它,那么根据继承的属性,每一个子类都有一个object ...

  4. 12_CXF入门

    [CXF] Apache CXF = Celtix + Xfire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.Apache CXF 是一个开 ...

  5. Microsoft Word Regular Expression

    Microsoft Word Regular Expression Word裏的正則表達式-不一樣的符號. 一.Normal Find and Replace 二.Search by using wi ...

  6. 构造函数为什么不能是虚函数 ( 转载自C/C++程序员之家)

    从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的.问题出来了,如果构造函数是虚的,就需要通过 vtable来调用, ...

  7. H5 App设计者需要注意的21条禁忌

    我们通常在做H5 APP设计的过程中,遇到很多看似很小,且很容易被忽略的问题,正是这些小问题,一次次的撩拨用户的耐心,让用户对你的APP心生怨念.现在WeX5君呕血为大家整理出H5 APP设计的21条 ...

  8. PHP — 用PHP实现一个双向队列

    1.简介 deque,全名double-ended queue,是一种具有队列和栈的性质的数据结构.双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行.双向队列(双端队列)就像是一个队 ...

  9. configure: error: zlib library and headers are required

    configure: error: zlib library and headers are required (1)直接看是zlib没安装导致的,yum list |grep zlib* 看到的是全 ...

  10. linux系统下的shell脚本

    #!/bin/bash  说明我需要启用bin目录下的bash解释器解释脚本##将第一个文件拷贝到第二个文件,如果出错将错误输出到/dev/null 的空.if判断cp的返回值是否为1,1为成功,0为 ...