博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javaweb一
阅读量:4699 次
发布时间:2019-06-09

本文共 9691 字,大约阅读时间需要 32 分钟。

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实现并传入),重要,需要掌握这些对象的用法。

  参考:

    

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

1     
2
AServlet
3
hello.AServlet
4
5
p1
6
v1
7
8
9
p2
10
v2
11
12
13
14
AServlet
15
/aservlet
16
web.xml配置
1 package hello; 2  3 import java.io.IOException; 4 import java.util.Enumeration; 5  6 import javax.servlet.Servlet; 7 import javax.servlet.ServletConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest;10 import javax.servlet.ServletResponse;11 12 /*Servlet是该体系的顶端接口13  *14  */15 public class AServlet implements Servlet {16 17     private ServletConfig sc;18     19     @Override20     /*生命周期方法:!!!初始化方法,在servlet在被tomcat创建时调用,只有一次,在执行构造函数方法之后立即被调用21      *注意:声明周期方法是被tomcat调用,所以传入的参数是由其自动传入,而且该对象也是有tomcat创建的,22      *    但是依据的是用户自己的web.xml配置文件23      *    24      * 初始化方法通常用来给servlet类进行赋值25      */26     public void init(ServletConfig ServletConfig) throws ServletException {27         System.out.println("init...");28         //使用tomcat提供的SerletConfig对象获取对应配置信息29         Enumeration
e=ServletConfig.getInitParameterNames();30 while(e.hasMoreElements()){31 String para=e.nextElement();32 System.out.println(para+"..."+ServletConfig.getInitParameter(para));33 }34 35 this.sc=ServletConfig;36 this.init();37 }38 39 public void init() {40 /*!!!该方法留空,是留给子类(如果有)覆盖的,不要是覆盖生命周期方法,因为其需要对该类进行配置41 * 这里要再次注意:Java中函数只要返回值/参数个数/参数类型 不同即使重写42 * 该方法只要在生命周期的init方法中调用即可,由继承的特点即可工作43 *44 * 这也是GenericServlet类中使用的方式45 */46 }47 48 @Override49 public ServletConfig getServletConfig() {50 System.out.println("getServletConfig...");51 return this.sc;52 }53 54 @Override55 public String getServletInfo() {56 System.out.println("getServletInfo...");57 return null;58 }59 60 /*生命周期方法:每次请求servlet都会调用,在init方法之后61 *62 */63 @Override64 public void service(ServletRequest ServletRequest, ServletResponse ServletResponse)65 throws ServletException, IOException {66 System.out.println("service...");67 }68 69 /*生命周期方法:销毁方法。注意并不是真正的删除对象,删除是垃圾回收器的任务,这里只是切断与对象的连接70 *同样只执行一次71 */72 @Override73 public void destroy() {74 System.out.println("destroy...");75 }76 77 }
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的关系:

1     
2
jsp
3
org.apache.jasper.servlet.JspServlet
4
5
fork
6
false
7
8
9
xpoweredBy
10
false
11
12
3
13
14 15
16
jsp
17
*.jsp
18
*.jspx
19
web.xml中的配置

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

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

1     
2
default
3
org.apache.catalina.servlets.DefaultServlet
4
5
debug
6
0
7
8
9
listings
10
false
11
12
1
13
14 15
16
default
17
/
18
web.xml中的配置

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

3、配置session,以后使用

1     
2
30
3
web.xml中的配置

 参考:

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

1 package hello; 2  3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.util.Set; 8  9 import javax.servlet.ServletContext;10 import javax.servlet.ServletException;11 import javax.servlet.annotation.WebServlet;12 import javax.servlet.http.HttpServlet;13 import javax.servlet.http.HttpServletRequest;14 import javax.servlet.http.HttpServletResponse;15 16 /**17  * Servlet implementation class CServlet18  */19 @WebServlet("/CServlet")20 public class CServlet extends HttpServlet {21     private static final long serialVersionUID = 1L;22 23     /**24      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)25      */26     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {27         //获取Servlet公共配置参数示例28         getInitPara();29         //获取该项目下的资源30         getPath();31         //获取该项目的类资源32         getClassPath1();33         getClassPath2();34     }35 36     private void getInitPara() {37         /*Servlet除了可以使用自己局部的参数,还可以使用公共的配置参数,即
中的配置参数38 * 必须通过ServletContext对象的方法来获取39 */40 ServletContext app=this.getServletContext();41 String context_value=app.getInitParameter("context-para");42 System.out.println(context_value);43 }44 45 private void getPath() {46 //获取该项目中指定资源的真实路径,带盘符47 String realPath=this.getServletContext().getRealPath("/index.jsp");48 //D:\Java\tomcat\apache-tomcat-7.0.42\me-webapps\hello\index.jsp49 System.out.println(realPath);50 51 //还可以进一步获取流对象52 //InputStream is=this.getServletContext().getResourceAsStream("/index.jsp");53 54 //还可以获取一个路径下的所有资源路径,注意只是浅获取,即只获取该目录下而不向下获取,用Set集合保存55 Set
set=this.getServletContext().getResourcePaths("/WEB-INF");56 System.out.println(set);57 } 58 59 private void getClassPath1() throws IOException {60 //获取类路径下资源,通过ClassLoader对象,在获取该资源的输入流对象就可以读取资源(文件)的内容了61 ClassLoader cl=this.getClass().getClassLoader();62 //注意:使用ClassLoader对象时,这里的路径是相对于 /项目/WEB-INF/classes ,也就是编辑器中的 /src63 InputStream is=cl.getResourceAsStream("/a.txt");64 BufferedReader br=new BufferedReader(new InputStreamReader(is));65 String line="";66 while((line=br.readLine())!=null){67 System.out.println(line);68 }69 }70 71 private void getClassPath2() throws IOException {72 //获取类路径下资源,通过Class对象,在获取该资源的输入流对象就可以读取资源(文件)的内容了73 Class
c=this.getClass();74 /*注意:使用Class对象时,75 * 如果路径以 / 开头,则相对 /项目/WEB-INF/classes ,也就是编辑器中的 /src76 * 如果不以 / 开头,则相对于当前servlet路径77 */78 InputStream is=c.getResourceAsStream("a.txt");79 is=c.getResourceAsStream("/../../index.jsp");80 BufferedReader br=new BufferedReader(new InputStreamReader(is));81 String line="";82 while((line=br.readLine())!=null){83 System.out.println(line);84 }85 }86 87 }
servlet的一些应用

 

HTTP访问乱码问题:

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

2、服务器端:

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

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

转载于:https://www.cnblogs.com/songfeilong2325/p/4493315.html

你可能感兴趣的文章
Error和Exception
查看>>
Python和Singleton (单件)模式[转载]
查看>>
httpclient设置proxy与proxyselector
查看>>
IT常用单词
查看>>
拓扑排序
查看>>
NYOJ--32--SEARCH--组合数
查看>>
JMS
查看>>
gulpfile 压缩模板
查看>>
【34.14%】【BZOJ 3110】 [Zjoi2013]K大数查询
查看>>
【 henuacm2016级暑期训练-动态规划专题 A 】Cards
查看>>
第五篇:白话tornado源码之褪去模板的外衣
查看>>
设备常用框架framework
查看>>
bootstrap模态框和select2合用时input无法获取焦点(转)
查看>>
MockObject
查看>>
BZOJ4516: [Sdoi2016]生成魔咒(后缀自动机)
查看>>
查看手机已经记住的WIFI密码
查看>>
最新版IntelliJ IDEA2019 破解教程(2019.08.07-情人节更新)
查看>>
C# 两个datatable中的数据快速比较返回交集或差集
查看>>
关于oracle样例数据库emp、dept、salgrade的mysql脚本复杂查询分析
查看>>
adb shell am 的用法
查看>>