孙卫琴老师的javaweb一书已经买了很多年,由于很厚一直也没有去好好阅读下, 项目发布后有闲暇时间,决定快速学习了,毕竟很多概念和知识主要还是复习。

对于互联网,我们可以简单认为浏览器就是会人类语言和html语言的机器人,它主要职责就是把html页面已我们可以理解的方式呈现,而tomcat等web服务器却是将java语言、jsp页面翻译为html页面发送给浏览器。由于http是应用层协议,基于tcp协议,所以我们自己也可以用socket等方式构建自己的web服务器,这部分java有个规范就是servlet。

 <?xml version="1.0" encoding="UTF-8"?>
 <Server port="8005" shutdown="SHUTDOWN">
     <Service name="Catalina">
         <Connector port="8080" protocol="HTTP/1.1"
             connectionTimeout="20000" redirectPort="8443">
             <Engine name="Catalina" defaultHost="localhost">
                 <Host name="localhost" appBase="webapps" unpackWARs="true"
                     autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"></Host>
             </Engine>
         </Connector>
     </Service>
 </Server>

Tomcat的工作模式:独立的Servlet容器,其他Web服务器进程内/外的Servlet容器。在使用tomcat时,需要配置JAVA_HOME和CATALINA_HOME,不过eclipse调试时,这部分配置都在Servers项目中,包括context,web,server等配置文件。

对于一个JavaWeb应用来说,最重要的就是Servlet组件(DispatcherServlet,对于现在框架来说,就是Spring mvc的Controller)和JSP组件了,编译后的文件将放在WEB-INF文件夹中,包括classes和lib等,有个简单的Servlet使用例子如下所示。

 public class CustomServlet extends GenericServlet {
     @Override
     public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
         ServletContext context = getServletContext();
         RequestDispatcher dispatcher = context.getRequestDispatcher("/index.jsp");
         dispatcher.forward(request, response);
     }
 }

接下来就是实际中比较重要的web.xml的设置了,一个简单的例子如下所示。

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
     <display-name>routine.web</display-name>
     <listener>
         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>
     <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:applicationContext.xml</param-value>
     </context-param>
     <servlet>
         <servlet-name>DispatcherServlet</servlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     </servlet>
     <servlet-mapping>
         <servlet-name>DispatcherServlet</servlet-name>
         <url-pattern>/</url-pattern>
     </servlet-mapping>
 </web-app>

更加详细的内容请详见:Github中javaDemo项目。

  • Servlet

javaWeb最核心的组件,相关对象包括ServletRequest/Response, ServletConfig, ServletContext,顾名思义就好,Servlet接口包括init, service, destory等主要方法,其通用实现为GenericServlet。在javaweb的生命周期中,启动阶段会加载web应用有关数据,创建ServletContext对象,对Filter和一些Servlet进行初始化,此外整个生命周期中都存在一个ServletContextListener监听器,可以在其contextInitialized/Destory方法中添加全局活动,比如禁止客户端缓存网页。

Servlet相关常见操作

功能

示例

下载

resp.setContentType("application/fore-download");

上传

enctype="MULTIPART/FORM-DATA"

commons-flieupload, commons-io

读写cookie

Cookie theCookie = new Cookie("name", "xionger");

resp.addCookie(theCookie);

Cookie[] cookies = req.getCookies();

转发和包含

RequestDispatcher dispatcher

= req.getServletContext().getRequestDispatcher("/other");

dispatcher.forward(req, resp);//include操作类似

重定向

resp.sendRedirect(String location);

  • JSP

Tomcat会将JSP编译为servlet文件,在JSP页面中包含request,response,pageContext,application,config,page,out,session,exception等内置对象,其常见包括转发<jsp:forward page="xxx">,包含<jsp:include page="xxx">。

  • 过滤器

就是一个面向切面的组建,可以再其中完成公共功能,Filter接口包括init,doFilter等方法,SpringMVC中也存在拦截器完成类似功能,具体在哪一层实现,不用纠结,方便就行。

  • JSTL Core标签库

到目前为止,jsp页面任然是javaweb开发最常见的一种实现,H5虽然更好,然相对来说工程效率慢一些,jsp页面最实用的知识就是jstl标签(尤其是其中的Core)和EL表达式了。(各类模板都类似,项目需要什么就及时学学就好)

功能

示例

Jstl标签

引入标签:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

条件: <c:if test="${name='xionger'}" var="result" scope="{page|request|session|application}">

<c:choose> <c:when> <c:otherwise>

循环:<select name="status">

<c:forEach items="${statusList }" var="rcs" varStatus="status">

<option value="${rcs.value() }">${rcs.describe() }</option>

</c:forEach>

</select>

其他: <c:import> <c:url> <c:redirect>

国际化: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

El表达式

语法: ${xxx},其中可以运算

隐含对象包括: applcationScope, pageContext, pageScope, requestScope, sessionScope等

Tip:EL表达式需要在Web.xml中设置为可用

常见javaweb项目页面部分结构

  • 访问数据库

下表为最基础的jdbc操作类,现在由于各类orm工具的原因,基本很少用到了,眼熟就好。

功能

示例

Driver,DriverManager

驱动器和其管理器

Connection接口

表示数据库连接

Statement

PreStatement接口

CallableStatement接口

负责执行SQL语句

负责执行预准备SQL语句

负责执行存储过程

ResultSet接口

表示SQL查询语句返回的结果集

Tip:

顺道记录一个jdbc调用sqlserver的坑,微软官方的jdbc驱动程序会把参数化的SQL中的varchar,nvarchar设置为最大长多,当参数多时会出现慢查询,要使用特定的驱动jar;此外还有一个maxAge的问题,需要单独设置。

  • 会话

这是Web比较基础的知识了,顺道复习一下,web服务器跟踪客户状态通常的4种方法为:HTML表单中添加隐藏字段,比较简单有效;重写url;用cookie保存;使用会话机制。会话是用于跟踪客户状态的普遍解决方案,对于servlet容器(tomcat)来说,当一个http请求到来时,其会在请求头的cookie中查找SessionID,如果不存在则创建。如果浏览器不支持cookie,Servlet容器可以重写Web组件的URL,把SessionID添加到URL中,其重写方法为:response.encodeURL("xxx.jsp"),此外会话也有监听器,持久化等内容,比较老旧就不介绍了。

Tip:

会话有个小问题就是,同一个用户的多个页面如果是同类操作,需要给每个页面设置一个独有的标识,用于存取值。

  • Email

Email通过Smtp协议发送信息,通过pop3协议拉去信息,java有个专门的类处理这部分内容,javax.mail.xxx

  • 常用组件

EJB组件(已过时),JBoss是一个EJB容器;SOAP服务,可以使用Apache AXIS组件(1代已过时),CXF,阿里的Dubbo是一个完整的解决方案;安全域,在web.xml中加入<security-constraint>;SSL,修改tomcat的server.xml文件中Connector节点(SSLEnabled=true);Ant编译,创建builder.xml,非常麻烦,已被maven取代。

  1. 版)[M]. 北京:电子工业出版社, 2009.=

Javaweb快速学习的更多相关文章

  1. JavaWeb快速入门

    孙卫琴老师的javaweb一书已经买了很多年,由于很厚一直也没有去好好阅读下, 项目发布后有闲暇时间,决定快速学习了,毕竟很多概念和知识主要还是复习. 对于互联网,我们可以简单认为浏览器就是会人类语言 ...

  2. JavaWeb基础学习体系与学习思路

    对于JAVAWEB的学习,首先一定要明确的是学习整体框架和思路,要有一个把控.对于WEB,很多人认为是做网页,简单的把静态网页与JAVAWEB与网页设计一概而论. 拿起一本JS就开始无脑的学习,学了一 ...

  3. 60分钟Python快速学习(给发哥一个交代)

    60分钟Python快速学习 之前和同事谈到Python,每次下班后跑步都是在听他说,例如Python属于“胶水语言啦”,属于“解释型语言啦!”,是“面向对象的语言啦!”,另外没有数据类型,逻辑全靠空 ...

  4. LinqPad工具:帮你快速学习Linq

    LinqPad工具:帮你快速学习Linq 参考: http://www.cnblogs.com/li-peng/p/3441729.html ★:linqPad下载地址:http://www.linq ...

  5. 快速学习C语言一: Hello World

    估计不会写C语言的同学也都听过C语言,从头开始快速学一下吧,以后肯定能用的上. 如果使用过其它类C的语言,如JAVA,C#等,学C的语法应该挺快的. 先快速学习并练习一些基本的语言要素,基本类型,表达 ...

  6. 【Java线程池快速学习教程】

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  7. 【Java的JNI快速学习教程】

    1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时 ...

  8. 快速学习bootstrap前台框架

    W3c里的解释 使用bootstrap需要注意事项 1.  在html文件第一行要加上<!doctype html>[s1] 2.  导入bootstrap.min.css文件 3.  导 ...

  9. C#快速学习笔记(译)

    下面是通过代码快速学习C#的例子. 1.学习任何语言都必定会学到的hello,world! using System; public class HelloWorld { public static ...

随机推荐

  1. .c与.cpp的区别解析

    这几天在练习数据结构等知识的时候,有时遇见文件保存为c后缀则能编译通过,有时又是保存cpp后缀才能通过.对于这个都没能区分清,是自己的基本功问题,于是百度了一下.幸好有许多和我一样有问题的人. 其实简 ...

  2. 子进程 已安装 post-installation 脚本 返回错误状态 1,dpkg: 处理软件包 python-crypto (--configure)时出错: 该软件包正处于非常不稳定的状态;

    这几天在学习redis的时候,装软件总是报错,两个问题都和dpkg有关,上网查阅了些解决办法,发现整体来说执行以下方法均可解决. 虽然每个人需要安装的包不同,但是出现此类问题的不同也只有安装包的名字, ...

  3. centos安装docker容器

    centos安装docker容器 系统环境需求 docker要运行在centos7系统中,系统为64位机器上,内核最小版本在3.10以上 如果系统为centos6,后面有附带的安装方法 uname - ...

  4. BZOJ 4086: [Sdoi2015]travel(SDOI2015 round2 day1)(分类讨论+容斥原理)

    描述:给定一张图(n<1000,m<5000)求有多少点对u,v有不重复经过其他点,共经过k个点的路径.(k<=7) 这个做法应该不是正解吧..顺便说下SDOI的几道题在BZ上都要卡 ...

  5. 剖析Asp.Net Web API中HttpController的激活

    在Asp.Net Web API中,请求的目标是定义在某个HttpController中的某个Action方法.当请求经过Asp.Net Web API消息处理管道到达管道"龙尾" ...

  6. 【转】Mysql分页语句Limit用法

    http://qimo601.iteye.com/blog/1634748 FAQ: MYSQL limit,offset 区别 SELECT keyword FROM `keyword_rank` ...

  7. Abp zero 3.0.1发布

    v3.1.0 (2017-02-14) Angular 2.x UI Angular 2 AOT (Ahead Of Time) Compilation, and HMR (Hot Module Re ...

  8. cassandra 数据到Java对象的映射绑定

    类似Hibernate和MyBatis的关系映射,自动帮你将查询数据或是修改的参数进行数据映射和绑定. 支持查询后返回数据ResultSet到Java对象的映射,支持修改.删除.查询之前参数的绑定. ...

  9. 开始了大概三四天的Rails学习之路

    最近因为一位极光推送朋友,我开始了大概三四天的Rails学习之路,最终达到的水平是可以比较轻松地做出大部分功能,然后自我感觉可以自如地按照Rails的设计思想去思考.由于编程的日益流行,我结识了越来越 ...

  10. Maven 使用笔记

    一:手动添加包进本地仓库 Maven 安装 JAR 包的命令是: mvn install:install-file -Dfile=jar包的位置 -DgroupId=[groupId] -Dartif ...