JavaWeb快速入门
孙卫琴老师的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取代。
- Servlet 3.0
其中最重要的一个概念就是web模块化,例如web应用中需要使用web框架,只需要将该框架的jar包复制到Web应用中即可。在这个jar包中的META-INF目录中,将放置配置服务和资源的web-fragment.xml文件,其三大特性和简单示例如下所示。
允许在没有框架配置的情况下使用框架,为您保留web.xml,将配置放在框架部分。
允许框架将自己的Web.xml放在自己的jar中,在应用启动时合并他们。
web.xml分段的概念,模块化的资源构成<webModule>.jar, 包含META-INF,以及其中的web-fragment.xml和resources.
<?xml version="1.0" encoding="UTF-8"?>
<web-fragment id="WebFragment_ID" 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-fragment_3_0.xsd">
<display-name>beforemodule</display-name>
<!-- 指定该Web模块的唯一标识 -->
<name>beforemodule</name>
<listener>
<listener-class>Web.listener.OnlineListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>/Web/jsp/online.jsp</welcome-file>
</welcome-file-list>
<ordering>
<!-- 用于配置该Web模块必须位于哪些模块之前加载 -->
<before>
<!-- 用于指定于其他所有模块之前加载 -->
<others/>
</before>
</ordering>
</web-fragment>
Tip:一个小问题,这是不是也就造就了springboot?
- 问题记录
http://blog.csdn.net/crazy1235/article/details/22872045
- 孙卫琴. Tomcat与Java Web开发技术详解(第2版)[M]. 北京:电子工业出版社, 2009.=
JavaWeb快速入门的更多相关文章
- 简单粗暴,详细得不要不要的 JavaWeb快速入门实例(1)
额,有些标题党的嫌疑,小细节不用在意哈... 前端时间我在写一个系列,是关于JavaWeb的一个入门级项目实战,我的初衷就是打算写给初学者的,希望能对他们有所帮助. 这段时间博主也接触了一些事情,感觉 ...
- javaWeb快速入门+——初体验-HelloWorld
文章转载自 https://www.cnblogs.com/1906859953Lucas/p/10821840.html 练习成品下载 https://www.lanzous.com/i9fljkj ...
- MyBatis学习总结(一)——MyBatis快速入门
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- MyBatis快速入门
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- MyBatis学习总结(一)——MyBatis快速入门(转载)
本文转载自http://www.cnblogs.com/jpf-java/p/6013537.html MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了 ...
- MyBatis入门学习教程-MyBatis快速入门
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- MyBatis学习总结(一)——MyBatis快速入门
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- MyBatis学习总结_01_MyBatis快速入门
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- 【转】MyBatis学习总结(一)——MyBatis快速入门
[转]MyBatis学习总结(一)——MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC ...
随机推荐
- ASP.NET MVC验证框架中关于属性标记的通用扩展方法
http://www.cnblogs.com/wlb/archive/2009/12/01/1614209.html 之前写过一篇文章<ASP.NET MVC中的验证>,唯一的遗憾就是在使 ...
- 洛谷P1140 相似基因 (DP)
洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...
- C++中this指针
原文 . this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自 ...
- SQL Server 行列相互转换命令:PIVOT和UNPIVOT使用详解
一.使用PIVOT和UNPIVOT命令的SQL Server版本要求 1.数据库的最低版本要求为SQL Server 2005 或更高. 2.必须将数据库的兼容级别设置为90 或更高. 3.查看我的数 ...
- MongoDB 聚合嵌入的数组(扁平化数据+管道)
MongoDB学习教程 先看下要操作的主要数据结构: { "_id" : "000015e0-3e9c-40b3-bd0d-6e7949f455c0", &qu ...
- java取得当前日期增加一天或多天
代码如下: SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getI ...
- sh脚本学习之:变量
变量的创建 环境配置 /etc/profile =>~/.bash_profile(~/.bash_login,~/.profile) => ~/.bashrc sh声明 name=&qu ...
- 雨林木风ghostwin7纯净版系统下载
雨林木风ghostwin7纯净版系统下载 关于easyuidatagrid的问题,跪求老司机带带我..... 关于cst_modesys/stat.h一个问题求解答谢谢 [程序]STM32使用SPI接 ...
- java关于图片处理修改图片大小
最近做了一个关于图片浏览的内容.因为图片都是一些证件的资料的扫描件所以比较大,对系统的影响也是非常之大的,有很大可能直接把系统干死.那么我是这么处理的,给大家分享一下.如果大家有好的方案的话一定要早点 ...
- iOS8 自定义navigationItem.titleView
navigationBar其实有三个子视图,leftBarButtonItem,rightBarButtonItem,以及titleView.前两种的自定义请参考http://www.cnblogs. ...