JavaWeb就是在服务器端以Java语言为解释运行基础的web程序。

php代码要想在服务器端运行,需要在服务器软件(通常是Apache)上加php的解释器,Java也一样,但是这个解释器是Tomcat。但还是有点不一样,可能与两种语言的特性有关:php是脚本语言,解释执行;而Java需要编译执行。php解释器添加到Apache上就可以了,但是只是将请求转交给Tomcat来执行并返回结果。(具体区别以后总结)

在eclipse中设置Javaweb环境

java web开发的基础:servlet

servlet是java提供的用于远程访问的接口,有一个http专用的子接口httpservlet抽象类,开发者只需要继承/实现相应类/接口即可进行http访问即web开发。有三种途径

  1、实现javax.servlet.Servlet接口;        --》顶层接口,只是定义了几个生命周期方法和简单方法

  2、 继承javax.servlet.GenericServlet类;      --》servlet接口的简单实现

  3、 继承javax.servlet.http.HttpServlet类;     --》专用于http协议的GenericServlet类的实现,注意这个类是没有抽象方法的抽象类

而tomcat的作用就是

  ①建立低层的连接,

  ②将请求信息封装为java对象(如ServletConfig,(Http)ServletRequest等,这是接口,有tomcat实现并传入),重要,需要掌握这些对象的用法。

  参考:http://blog.csdn.net/tong_xinglong/article/details/12972819

    http://blog.sina.com.cn/s/blog_696024a90100o6hq.html

  ③调用相应的servlet,通过web.xml配置文件

     <servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>hello.AServlet</servlet-class>
<init-param>
<param-name>p1</param-name>
<param-value>v1</param-value>
</init-param>
<init-param>
<param-name>p2</param-name>
<param-value>v2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/aservlet</url-pattern>
</servlet-mapping>

web.xml配置

 package hello;

 import java.io.IOException;
import java.util.Enumeration; import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; /*Servlet是该体系的顶端接口
*
*/
public class AServlet implements Servlet { private ServletConfig sc; @Override
/*生命周期方法:!!!初始化方法,在servlet在被tomcat创建时调用,只有一次,在执行构造函数方法之后立即被调用
*注意:声明周期方法是被tomcat调用,所以传入的参数是由其自动传入,而且该对象也是有tomcat创建的,
* 但是依据的是用户自己的web.xml配置文件
*
* 初始化方法通常用来给servlet类进行赋值
*/
public void init(ServletConfig ServletConfig) throws ServletException {
System.out.println("init...");
//使用tomcat提供的SerletConfig对象获取对应配置信息
Enumeration<String> e=ServletConfig.getInitParameterNames();
while(e.hasMoreElements()){
String para=e.nextElement();
System.out.println(para+"..."+ServletConfig.getInitParameter(para));
} this.sc=ServletConfig;
this.init();
} public void init() {
/*!!!该方法留空,是留给子类(如果有)覆盖的,不要是覆盖生命周期方法,因为其需要对该类进行配置
* 这里要再次注意:Java中函数只要返回值/参数个数/参数类型 不同即使重写
* 该方法只要在生命周期的init方法中调用即可,由继承的特点即可工作
*
* 这也是GenericServlet类中使用的方式
*/
} @Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig...");
return this.sc;
} @Override
public String getServletInfo() {
System.out.println("getServletInfo...");
return null;
} /*生命周期方法:每次请求servlet都会调用,在init方法之后
*
*/
@Override
public void service(ServletRequest ServletRequest, ServletResponse ServletResponse)
throws ServletException, IOException {
System.out.println("service...");
} /*生命周期方法:销毁方法。注意并不是真正的删除对象,删除是垃圾回收器的任务,这里只是切断与对象的连接
*同样只执行一次
*/
@Override
public void destroy() {
System.out.println("destroy...");
} }

AServlet

package hello;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class BServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//注意这里的两个方法:doGet()和doPost()必须实现一个
//就是使用的传输方法:get/post,就实现对应的方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doGet...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost...");
}
}
、、

HttpServlet的一个简单实例

servlet细节:

1、每个servlet只会生成一个类实例,即单例模式,所以有线程安全问题。线程安全的解决方法有

  1、不在servlet中创建成员,使用局部变量

  2、可以创建无状态成员。所谓状态成员也就是描述一个事物的,即类的属性。

  3、创建有状态成员,但是状态必须是只读的。也就是说可以有属性,但是只有读取的方法而没有写的方法。

2、servlet对象的创建时间:默认是在用户首次调用时创建对象,所以第一次使用时较慢;但是可以在web.xml中对应的servlet配置中配置一条

  <load-on-startup>0</load-on-startup>,只要值>=0即可在tomcat开启时自动创建。如果有多个,则按照值升序依次创建

3、在web.xml配置<url-pattern>的值可以有多个与一个<servlet-name>对应,并且可以使用*通配符。

  注意:通配符只能放在开头(匹配路径)或结尾(匹配扩展名)。

  匹配的优先级:具体的路径(/a/b.jsp)>使用通配符的路径(/a/b.*)>根路径(/,匹配所有路径)

web.xml中的默认配置有以下作用

1、servlet和JSP的关系:

     <servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>

web.xml中的配置

由配置信息可知:所有以JSP结尾的文件都会转交到org.apache.jasper.servlet.JspServlet这个类中进行处理

2、访问一个不存在的路径时显示404页面

     <servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

web.xml中的配置

由配置信息可知:所有没有其他servlet接收的路径(即无效不存在的路径)都会被转到org.apache.catalina.servlets.DefaultServlet中去处理,就是显示404页面

3、配置session,以后使用

     <session-config>
<session-timeout>30</session-timeout>
</session-config>

web.xml中的配置

参考:http://blog.csdn.net/guihaijinfen/article/details/8363839

servlet是通过配置文件,使用反射技术产生对象实例的

 package hello;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Set; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class CServlet
*/
@WebServlet("/CServlet")
public class CServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Servlet公共配置参数示例
getInitPara();
//获取该项目下的资源
getPath();
//获取该项目的类资源
getClassPath1();
getClassPath2();
} private void getInitPara() {
/*Servlet除了可以使用自己局部的参数,还可以使用公共的配置参数,即<context-para>中的配置参数
* 必须通过ServletContext对象的方法来获取
*/
ServletContext app=this.getServletContext();
String context_value=app.getInitParameter("context-para");
System.out.println(context_value);
} private void getPath() {
//获取该项目中指定资源的真实路径,带盘符
String realPath=this.getServletContext().getRealPath("/index.jsp");
//D:\Java\tomcat\apache-tomcat-7.0.42\me-webapps\hello\index.jsp
System.out.println(realPath); //还可以进一步获取流对象
//InputStream is=this.getServletContext().getResourceAsStream("/index.jsp"); //还可以获取一个路径下的所有资源路径,注意只是浅获取,即只获取该目录下而不向下获取,用Set集合保存
Set<String> set=this.getServletContext().getResourcePaths("/WEB-INF");
System.out.println(set);
} private void getClassPath1() throws IOException {
//获取类路径下资源,通过ClassLoader对象,在获取该资源的输入流对象就可以读取资源(文件)的内容了
ClassLoader cl=this.getClass().getClassLoader();
//注意:使用ClassLoader对象时,这里的路径是相对于 /项目/WEB-INF/classes ,也就是编辑器中的 /src
InputStream is=cl.getResourceAsStream("/a.txt");
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line="";
while((line=br.readLine())!=null){
System.out.println(line);
}
} private void getClassPath2() throws IOException {
//获取类路径下资源,通过Class对象,在获取该资源的输入流对象就可以读取资源(文件)的内容了
Class<? extends CServlet> c=this.getClass();
/*注意:使用Class对象时,
* 如果路径以 / 开头,则相对 /项目/WEB-INF/classes ,也就是编辑器中的 /src
* 如果不以 / 开头,则相对于当前servlet路径
*/
InputStream is=c.getResourceAsStream("a.txt");
is=c.getResourceAsStream("/../../index.jsp");
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line="";
while((line=br.readLine())!=null){
System.out.println(line);
}
} }

servlet的一些应用

HTTP访问乱码问题:

1、客户端:最常见的是浏览器,在url中有中文时,最好使用URLEncoder对其进行编码,而且最好使用UTF-8编码

2、服务器端:

  ①接收数据:通过servlet接收,然后通过getParameter()进行获取时,使用的编码默认是iso-8859-1,所以要对接收到的数据进行重新转码包装

  ②响应数据:首先使用iso-8859-1编码,如果超过编码范围则使用系统编码,

javaweb一的更多相关文章

  1. 从啥也不会到可以胜任最基本的JavaWeb工作,推荐给新人的学习路线(二)

    在上一节中,主要阐述了JavaScript方面的学习路线.先列举一下我朋友的经历,他去过培训机构,说是4个月后月薪过万,虽然他现在还未达到这个指标. 培训机构一般的套路是这样:先教JavaSE,什么都 ...

  2. JavaWeb——Servlet

    一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...

  3. JavaWeb——Listener

    一.基本概念 JavaWeb里面的listener是通过观察者设计模式进行实现的.对于观察者模式,这里不做过多介绍,大概讲一下什么意思. 观察者模式又叫发布订阅模式或者监听器模式.在该模式中有两个角色 ...

  4. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  5. javaWeb应用打包

    在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

  6. JavaWeb——tomcat安装及目录介绍

    一.web web可以说,就是一套 请求->处理->响应 的流程.客户端使用浏览器(IE.FireFox等),通过网络(Network)连接到服务器上,使用HTTP协议发起请求(Reque ...

  7. 做JavaWeb开发不知Java集合类不如归家种地

    Java作为面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.但是使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容 ...

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

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

  9. Eclipse下配置javaweb项目快速部署到tomcat

    用惯了VS,再用Eclipse,完全有一种从自动挡到手动挡的感觉啊. 很多同学在Eclipse下开发web项目,每一次修改代码,看效果的时候都有右键项目->Run as -> Run on ...

  10. javaweb学习笔记之servlet01

    一.Servlet概述 A servlet is a small Java program that runs within a Web server. Servlets receive and re ...

随机推荐

  1. 从C到OCblocks语法的声明

           在过去的一段时间,我开始从C的一些简单声明到更复杂的学习直到我开始学习了Objective-C中的blocks.我花了很长的一段时间去理解他并且认识到一旦你理解它是怎样组织的并且是怎样产 ...

  2. 《剑指offer》树的子结构

    一.题目描述 输入两颗二叉树A,B,判断B是不是A的子结构. 二.输入描述 输入两棵树A,B. 三.输出描述 判断B是不是A的子结构,是返回true,否则返回false. 四.牛客网提供的框架 /* ...

  3. vue分页组件火狐中出现样式问题

    分页的操作到了火狐浏览器会样式 怎么解决? 其实就是将input的type属性变成了text,因为number属性会变成上下的小箭头

  4. 使用 Beego 搭建 Restful API 项目

    1 环境准备 首先你需要在你的环境安装以下软件: go:编程语言运行环境 git:版本控制工具 beego:go 语言流行的开发框架 bee:beego 配套的快速搭建工具 你喜欢的数据库:这里以 M ...

  5. [POI2015]WIL-Wilcze doły(单调队列)

    题意 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. (1<=d<=n< ...

  6. python-排序算法 冒泡和快速排序

    交换排序 交换排序有冒泡排序和快速排序 冒泡排序 冒泡排序就是每次找出最大(最小)元素,放在集合最前或最后,这是最简单的排序算法 print("未排序之前:",collection ...

  7. gluPerspective和gluLookAt的关系

    参考文章 GL学习笔记(2) - 终于搞明白gluPerspective和gluLookAt的关系了(zz) gluPerspective的具体含义 解密--神秘的gluPerspective 函数原 ...

  8. openGl超级宝典学习笔记 (2) 7个主要的几何图元

    点(GL_POINTS): 点总是正方形的像素,默认情况下,点的大小不受透视除法影响. 即无论与视点的距离怎样,它的大小都不改变.为了获得圆点.必须在抗锯齿模式下绘制点. 能够用glPointSize ...

  9. LeetCode_Construct Binary Tree from Inorder and Postorder Traversal

    一.题目 Construct Binary Tree from Inorder and Postorder Traversal My Submissions Given inorder and pos ...

  10. 使用spring-loaded开源项目,实现java程序和web应用的热部署

    JDK1.5之后提供了java.lang.instrument.Instrumentation,即java agent机制可以实现类的redefinition和retransform. redefin ...