java学习笔记-JavaWeb篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java学习笔记-JavaWeb篇相关的知识,希望对你有一定的参考价值。

JavaWEB篇

1 Tomcat的安装和配置

1.部署并启动tomcat服务器

1). 解压tomcat安装包到一个非中文目录下

2). 配置一个环境变量 java_home(指向jdk安装的根目录)或jre_home

3). 通过tomcat安装目录bin目录下的startup.bat,启动服务器

4). 可以在浏览器中输入localhost:8080来检验Tomcat安装是否正确

5). 若已经启动了一个Tomcat应用,若再启动同一个Tomcat应用,会抛出异常:

Java.net.BindException:Addresss aleady in use:JVM_Bind:8080

端口已经被占用

2.Tomcat:开源的Servlet容器

3.可以通过修改server.xml文件中的配置信息来修改Tomcat服务器的端口号:

    <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

把port的值修改为其他的端口号即可

4. 为了可以在任意目录下启动Tomcat服务器

4.1 把D:\Program Files\apache-tomcat-7.0.37\bin 添加到path下

添加成功后,若在任意目录下通过startup其中Tomcat服务器,会有提示:

The catalina_home environment variable is not defined correctly

This environment variable is needed to run this program

即:要求设置CATALINA_HOME这个环境变量

5. 设置CATALINA_HOME环境变量

5.1 通过阅读stratup.bat批处理文件,可知CATALINA_HOME环境变量下有一个bin目录,而bin目录下又有一个catalina.bat文件,由此可知CATALINA_HOME指向的应该是Tomcat安装的根目录

于是吧Tomcat的根目录设为CATALINA_HOME环境变量

此时既可以在任意目录下用过startup.bat shutdown.bat启动、关闭服务器

6.继续阅读stratup.bat批处理文件,发现启动Tomcat服务器的是catalina.bat文件

在命令行窗口直接输入catalina,提示如下:

commands:

  debug             Start Catalina in a debugger

  debug -security   Debug Catalina with a security manager

  jpda start        Start Catalina under JPDA debugger

  run               Start Catalina in the current window

  run -security     Start in the current window with security manager

  start             Start Catalina in a separate window

  start -security   Start in a separate window with security manager

  stop              Stop Catalina

  configtest        Run a basic syntax check on server.xml

  version           What version of tomcat are you running?

Catalina命名有如上的可选参数

Run:在catalina同一个命令行窗口下启动服务器

Start:开启一个新窗口启动服务器

Stop:关闭服务器

2 JavaWeb开发的目录结构

7.第一个WEB应用程序:开发,并部署到Tomcat服务器下运行

1). 在Eclipse新建一个Java Project

2). 在Java项目下创建Web开发的目录结构

-WebContent

      -WEB-INF

           -classes(编译后的class文件必须放在此目录下)

           -lib

           -web.xml(从D:\Program Files\apache-tomcat-7.0.37\webapps\docs\WEB-INF拷贝过来,可以不做修改)

      html页面

      JSP页面

      图片…

3). 在src下新建一个Person类

Package com.atguigu.test;

Public class Person{

Public String getPersonInfo(){

Return “Person info…”;

}

}

4). 手工把Person类对应的class文件(含包)复制到classes目录下

可以通过修改默认的输出目录达到自动把编译好的class放到classes目录下

5). 在webcontent目录下新建一个JSP文件:

%@page import="com.centfor.test.Person"%

<%

    Person p = new Person();

    System.out.print(p.getPersonInfo());

 %>

6). 把WebContent目录复制到Tomcat的webapps目录下,并改名为:helloword

7). 在浏览器的地址栏中输入:http://localhost:8080/helloworld/hello.jsp即可看到命令行的打印信息

8). 配置任意目录下的web应用程序:

在conf目录下依次创建catalina\localhost目录,然后在localhost目录下为test这个web应用程序建立test.xml文件,编辑这个文件输入以下内容

<context

docBase = “E:\\Java\\source\\atguigu\\java-1\\firstwebapp\\webcontent”

reloadable = “true”/>

3使用Eclipse开发JavaWeb项目

1. 使用JavaEE版的Eclipse开发动态的WEB工程(JavaWEB项目)

1). 把开发选项切换到JavaEE

2). 可以在Window->Show View 中找到Package Explorer,并把其拖拽到开发区的左边

3). 在Servers面板中新建Tomcat服务器,一定要关联到Tomcat安装的根目录

4). 新建一个Dynamic Web Project。其中Target Runtime 需选择Tomcat6.0

5). 开发JavaWeb应用

6).可以通过run on server来运行WEB项目

4第一个Servlet程序

2. servlet的HelloWorld

1). 创建一个Servlet接口的实现类

Public class HelloServlet implements  Servlet

5 JavaWeb_Servlet的配置及生命周期方法

2). 在web.xml文件中配置和映射这个Servlet

<!-- 配置和映射servlet -->

 <servlet>

     <!-- Servlet注册的名字 -->

     <servlet-name> HelloServlet </servlet-name>

     <!-- Servlet的全类名 -->

     <servlet-class>com.centfor.test.HelloServlet</servlet-class>

<servlet-mapping>

     <!-- 需要和某一个Servlet节点servlet-name子节点的节点文本一致 -->

           <servlet-name> HelloServlet </servlet-name>

     <!-- 映射具体的访问路径:/代表当前Web应用的根目录 -->

           <url-pattern>/Hello</url-pattern>

 </servlet-mapping>

 </servlet>

3. Servlet容器:运行Servlet、JSP、Filter等的软件环境

1). 可以来创建Servlet,并调用Servlet的相关生命周期方法

2). JSP、Filter、Listener、Tag……

5 Servlet 的配置及生命周期方法

4. Servlet生命周期的方法:以下方法都由Servlet容器负责调用

1). 构造器:只被调用一次,只有第一次请求Servlet时,创建Servlet的实例

这说明Servlet是单实例的!

2). Init方法:只被调用一次,在创建好实例后立即被调用,用于初始化当前Servlet。

3). Service:被多次调用,每次请求都会调用service方法,实际用于响应请求的

4). Destroy: 只被调用一次,在当前Servlet所在的Web应用被卸载前调用,用于释放当前Servlet所占的资源

5. load-on-startup参数:

1). 配置在Servlet节点中:

<!-- 配置和映射servlet -->

<servlet>

     <!-- Servlet注册的名字 -->

     <servlet-name> HelloServlet </servlet-name>

     <!-- Servlet的全类名 -->

     <servlet-class>com.centfor.test.HelloServlet</servlet-class>

<!-- 可以指定Servlet被创建的时机 -->

     <load-on-startup>-1</load-on-startup>

</servlet>

2). Load-on-startup:可以指定Servlet被创建的时机,若为负数,则在第一次请求时被创建。若为0或正数,则在当前Web应用被Servlet容器加载时创建实例,且数值越小越早被创建。

6. 关于Servlet-mapping:

1). 同一个Servlet可以被映射到多个URL上,即多个 <servlet-mapping> 元素的 <servlet-name>子元素的设置值可以是同一个Servlet的注册名。

2). 在Servlet映射到的URL中也可以使用 * 通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头“/*”结尾。

<servlet-mapping>

            <servlet-name>secondServlet</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>

OR

<servlet-mapping>

           <servlet-name>secondServlet</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

注意:以下的既有/又有扩展名的不合法

<servlet-mapping>

           <servlet-name>secondServlet</servlet-name>

<url-pattern>/*.action</url-pattern>

</servlet-mapping>

6 ServletConfig 对象

7. ServletConfig:封装了Servlet的配置信息,并且可以获取ServletContext对象

1). 配置Servlet

<!-- 配置和映射servlet -->

 <servlet>

     <!-- Servlet注册的名字 -->

     <servlet-name> HelloServlet </servlet-name>

     <!-- Servlet的全类名 -->

     <servlet-class>com.centfor.test.HelloServlet</servlet-class>

     <!-- 配置Servlet的初始化参数,且节点必须在load-on-startup节点的前边-->

     <init-param>

           <!-- 参数名 -->

           <param-name>user</param-name>

           <!-- 参数值 -->

           <param-value>root</param-value>

     </init-param>

     <init-param>

           <param-name>password</param-name>

           <param-value>123456</param-value>

     </init-param>

      <!-- 可以指定Servlet被创建的时机 -->

     <load-on-startup>-1</load-on-startup>

 </servlet>

2). 获取初始化参数:

> getinitparameter(String name):获取指定参数的初始化参数

> getinitParameterNames():获取参数名组成的Enumeration对象

String user = servletConfig.getInitParameter("user");

           System.out.println("user:" + user);

          

           Enumeration<String> names = servletConfig.getInitParameterNames();

           while(names.hasMoreElements()){

                 String name = names.nextElement();

                 String value = servletConfig.getInitParameter(name);

                 System.out.println("^^" + name + ":" + value);

           }

3).获取Servlet的配置名称(了解)

       String servletName = servletConfig.getServletName();

           System.out.println(servletName);

7 ServletContext

8. ServletContext

1). 可以由ServletConfig获取

ServletContext servletContext = servletConfig.getServletContext();

2). 该对象代表当前Web应用:可以认为ServletContext是当前Web应用的一个大管家,可以从中获取到当前Web应用的各个方面的信息。

① 获取当前Web应用的初始化参数:可以为所有的servlet所获取,而servlet的初始化参数只有那个servlet可以获取

设置初始化参数:

<!-- 配置当前Web应用的初始化参数 -->

 <context-param>

     <param-name>driver</param-name>

     <param-value>com.mysql.jdbc.Driver</param-value>

 </context-param>

方法:

GetinitParameter

GetinitParameterNames

代码:

//获取ServletContext对象

           ServletContext servletContext = servletConfig.getServletContext();

          

           String driver = servletContext.getInitParameter("driver");

           System.out.println("driver:" + driver);

          

           Enumeration<String> names2 = servletContext.getInitParameterNames();

           while(names2.hasMoreElements()){

                 String name = names2.nextElement();

                 String value = servletContext.getInitParameter(name);

                 System.out.println("^^" + name + ":" + value);

           }

② 获取当前Web应用的某一个文件在服务器上的绝对路径,而不是部署前的路径

GetRealPath(String path);

代码:

           String realPath = servletContext.getRealPath("/note.txt");

           //不是:F:\MyEclipse 10\day_0509\note.txt

           System.out.println(realPath);

③ 获取当前Web应用的名称:

GetContextPath();

代码:

String contextPath = servletContext.getContextPath();

           System.out.println(contextPath);

④ 获取当前Web应用的某一个文件对应的输入流

GetResourceAsStream(String path):path的/ 为当前Web应用的根目录

代码:

InputStream

is2 =  servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");

⑤ 和attribute相关的几个方法:

8 HTTP 协议_GET&POST请求

9.GET请求和POST请求

1). 使用GET方式传递参数:

① 在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。

② 如果网页中的<form>表单元素的method属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。

③ 使用GET请求方式给WEB服务器传递参数的格式:

http://www.lamp  brother.net/counter.jsp?name=lc&password=123

④ 使用GET方式传送的数据量一般限制在1KB以下。

2). 使用POST方式传递参数:

① POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据。

② POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。 

POST /counter.jsp HTTP/1.1

Referer: http://localhost:8080/Register.html

Content-type: application/x-www-form-urlencoded

Host:localhost:43

 

Name=zhangsan&password=123           --请求体中传递参数

9 ServletRequest

10.如何在Servlet中获取请求信息:

1). Servlet的service() 方法用于应答请求:因为每次请求都会调用service()方法

public void service(ServletRequest request, ServletResponse response)

                 throws ServletException, IOException

ServletRequest:封装了请求信息,可以从中获取到任何的请求信息。

ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现。

这两个接口的实现类都是服务器给予实现的,并在服务器调用service()方法时传入

2). ServletRequest:

① 获取请求参数:

String  getParameter(String name):根据请求参数的名字,返回参数

若请求参数有多个值(例如checkbox),该方法只能读取到第一个提交的值

String[]    getParameterValues(String name) :根据请求参数的名字,返回请求参数对应的字符串数组

Enumeration<String>   getParameterNames():返回参数名对应的Enumeration对象,类似于ServletConfg(或ServletContext)的getinitParameterNames()方法

Map<String,String[]>  getParameterMap():返回请求参数的键值对 key:参数名 value:参数值,String数组类型

② 获取请求的URL:

 HttpServletRequest httpServletRequest = (HttpServletRequest)request;

String requestURL = httpServletRequest.getRequestURL();

System.out.println(requestURL);

③ 获取请求方式:

String method = httpServletRequest.getMethod();

System.out.println(method);   //GET

④ 若是一个GET请求,获取请求参数对应的那个字符串,即 ? 后的那个字符串

String queryString = httpServletRequest.getQueryString();

System.out.println(queryString);

//user=atguigu&password=123456&interesting=party&interesting=shopping&interesting=game/loginServlet

⑤ 获取请求的Servlet的映射路径

String servletPath = httpServletRequest.getservletPath();

System.out.println(servletPath);   //loginservlet

⑥ 和attribute相关的几个方法

10 ServletResponse

3). HttpServletRequest:是ServletRequest的子接口。针对于HTTP请求所定义,里边包含了大量获取Http的信息

4). ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现。

① *getWriter(): 返回PrintWriter对象,调用该对象的print()方法,将把print()中的参数直接打印到客户的浏览器上

② 设置响应的内容类型:response.setConfigType(“application/msword”);

③ void sendRedirect(String location):请求的重定向(此方法为HttpServletResponse中定义)

---------------------------------习题------------------------------------

在web.xml文件中设置两个WEB应用的初始化参数,user,password。

定义一个login.html,里边定义两个请求字段:user,password

再创建一个LoginServlet,在其中获取请求的user,password。比对其和web.xml文件中定义的请求参数是否一致

若一致,响应Hello:xxx,若不一致,响应Sorry:xxx     其中xxx为user

11 GenericServlet

1.GenericServlet(了解)

1). 是一个Servlet。是Servlet接口和ServletConfig接口的实现类,但是一个抽象类,其中的service方法为抽象方法

2). 如果新建的Servlet程序直接继承GenericServlet会使开发更简洁些。

3). 具体实现:

① 在GenericServlet中声明了一个ServletConfig类型的成员变量,在Init(ServletConfig)方法中对其进行了初始化

② 利用ServletConfig成员变量的方法实现了ServletConfig接口的方法

③ 还定义了一个init()方法,在init(ServletConfig)方法中对其进行调用,子类可以直接覆盖Init(),在其中实现对Servlet的初始化

④ 不建议直接覆盖init(ServletConfig),因为如果忘记编写super.init(config);而还是利用了ServletConfig接口的方法,则会出现空指针异常

⑤ 新建的init(){}并非Servlet的生命周期方法,而init(ServletConfig)是生命周期相关的方法

12 HttpServlet

2.HttpServlet

1). 是一个Servlet,继承自GenericServlet,针对于Http协议所定制

2). 在service() 中直接把ServletRequest和ServletResponse转为HttpServletRequest和HttpServletResponse,并调用了重载的service(HttpServletRequest, HttpServletResponse)

在service(HttpServletRequest, HttpServletResponse)获取请求方式:request.getMethod().根据请求方式又创建了doXxx()方法(xxx为具体的请求方式,如doGet,doPost)

3). 实际开发中,直接继承HttpServlet,并根据请求方式复写doXxx()方法(主要指doGet或doPost)

4).好处:直接由针对性的覆盖doXxx()方法;直接使用HttpServletRequest和HttpServletResponse,不再需要强转

13小结及练习

3.

-------------------------------------习题-----------------

在MySql数据库中创建一个test_users数据表,添加3个字段:id,user,password,并录入几条记录

定义一个login.html,里边定义两个请求字段:user,password 发送请求道loginServlet

再创建一个LoginServlet(需要继承自HttpServlet,并重写其doPost方法)

在其中获取请求的user,password

利用JDBC从test_users中查询有没有和页面输入的user,password对应的记录

Select count(id) from test_user where user = ? and password = ?

若有,响应Hello:xxx,若没有,响应Sorry:xxx     其中xxx为user

14 JSP 概述

4 请求的转发和重定向:

1). 本质区别: 请求的转发只发出了一次请求,而重定向则发出了两次请求

具体:

① 请求的转发:地址栏是初次发出请求的地址

请求的重定向:地址栏不再是初次发出的请求地址。地址栏为最后响应的那个地址。

② 请求转发:在最终的Servlet中,request对象和中转的那个request是同一个对象

请求的重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象

5. JSP

1). WHY:

JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写。

2). Java Server Page:Java服务器端网页,在HTML页面中编写Java代码的页面

2). Helloworld:

新建一个JSP页面,在body节点内的<%  %>即可编写Java代码

<body>

      <%

           Date date = new Date();

           Syetem.out.print(date);

%>

</body>

3). JSP可以放置在WEB应用程序中的除了WEB-INF及其子目录外的其他任何目录中,JSP页面的访问路径与普通HTML页面的访问路径形式也完全一样。

4). JSP的运行原理:

每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序

15 JSP 页面的 9 个隐含对象

5). JSP页面的隐含变量:没有声明就可以使用的对象,JSP页面一共有9个隐含对象

Public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) {

        throws java.io.IOException, javax.servlet.ServletException

PageContext pageContext = null;

HttpSession session = null;

ServletContext application = null;

ServletConfig config = null;

JspWriter out = null;

Object page = this;

//……………………..

//使用<% %>编写的代码在此位置,可以用到request,response,pagecontext,session,

//application,config,out,page这8个隐含对象。(实际上还可以使用一个叫exception的隐含对象)

}

① request:HttpServletRequest 的一个对象

② response:HttpServletResponse 的一个对象(在JSP页面中几乎不会调用任何response的方法)

③ pageContext:页面的上下文,是PageContext的一个对象,可以从该对象中获取到其他8个隐含对象。也可以从中获取到当前页面的其他信息。(学习自定义标签时使用它)

④ session:代表浏览器和服务器的一次会话,是HttpSession的一个对象。后面详细学习。

⑤ application:代表当前WEB应用。是ServletContext对象。

⑥ config:当前JSP对应的Servlet的ServletConfig对象(几乎不使用)。若需要访问当前JSP配置的初始化参数,需要通过映射的地址才可以。

映射JSP:

<servlet>

    <servlet-name>hellojsp</servlet-name>

    <jsp-file>/Hello.jsp</jsp-file>

    <init-param>

       <param-name>test</param-name>

       <param-value>123456789</param-value>

    </init-param>

 </servlet>

 

 <servlet-mapping>

    <servlet-name>hellojsp</servlet-name>

    <url-pattern>/hellojsp</url-pattern>

 </servlet-mapping>

⑦ out:JspWriter对象。调用out.println()可以直接把字符串打印在浏览器上。

⑧ page:指向当前JSP对应的Servlet对象的引用,但为Object类型,只能调用Object类的方法(很少使用)

⑨ exception:在声明了page指令的isErrorPage=true”时,才可以使用

<%@ page isErrorPage = "true" %>

pageContext,request,session,application(对属性的作用域的范围从小到大)

out,response,config,page

exception

6). JSP模版元素:JSP页面中的静态HTML内容

7). JSP表达式(expression)提供了将一个java变量或表达式的计算结果输出到客户端的简化方式,它将要输出变量或表达式直接封装在<%= 和%>之中。

<%

    Date date = new Date();

    Out.print(date);

%>

<%= date %>

8).JSP脚本片段(scriptlet)是指嵌套在<%和%>之中的一条或多条Java代码程序

多个脚本片段中的代码可以相互访问

<%

       String ageStr = request.getParameter("age");

       Integer age = Integer.parseInt(ageStr);

      

       if(age >= 18){

    %>

       成年人....

      

    <%

           }else if(age < 18){

    %> 

       未成年人...

    <%    

       }

     %>

16 JSP语法

 

20 page指令

1. JSP指令:是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分

2. 在目前的JSP2.0中,定义了page、include和taglib这三种指令

3.page指令

1). Page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置

2). Page指令常用的属性:

① import属性:指定当前JSP页面对应的Servlet需要导入的类

<%@ page import = “java.text.DateFormat” %>

② session属性:取值为true或false,指定当前页面的session隐藏变量是否可用,也可以说访问当前页面时是否一定要生成HttpSession对象

<%@ page session = “false” %>

③ errorPage 和isErrorPage:

  • ErrorPage 指定当前页面出现错误的实际响应页面是什么,其中/表示的是当前Web应用的根目录

<%@ page errorPage = “/error.jsp” %>

  • 在响应error.jsp时,JSP引擎使用的请求转发的方式。
  • isErrorPage指定当前页面是否为错误处理页面,可以说明当前页面是否可以使用exception隐藏变量。需要注意的是:若指定isErrorPage=’true’,并使用exception的方法了,一般不建议能够直接访问该页面。
  • 如何使客户不能直接访问某一个页面呢?对于Tomcat服务器而言,WEB-INF下的文件是不能通过在浏览器中直接输入地址来访问的。但通过请求的转发是可以的!
  • 还可以在web.xml文件中配置错误页面:

<error-page>

  <!-- 指定出错的代码:404 没有指定的资源  500内部错误 -->

     <error-code>404</error-code>

     <!-- 指定响应页面的位置 -->

     <location>/WEB-INF/error.jsp</location>

  </error-page>

 <error-page>

    <!-- 指定异常的类型 -->

        <exception-type>java.lang.ArithmeticException</exception-type>

    <location>/WEB-INF/error.jsp</location>

 </error-page>

④ contenttype:指定当前JSP页面的响应类型,实际调用的是response.setContentType("text/html; charset= UTF-8");通常情况下,对于JSP页面而言其取值均为text/html;charset=UTF-8.charset指定返回的页面的字符编码是什么。通常取值为UTF-8.

⑤ pageEncoding:指定当前JSP页面的字符编码,通常情况下该值和contentType中的charset一致

⑥ isELIgnored:指定当前JSP页面是否可以使用EL表达式,通常取值为true。

21 include指令

 

22 JSP 标签

23 中文乱码问题

24 JSP 小结(2)

25 MVC 设计模式

无笔记

26 MVC 案例之查询

 

27 MVC 案例之删除

 

以上是关于java学习笔记-JavaWeb篇的主要内容,如果未能解决你的问题,请参考以下文章

Javaweb学习笔记之Spring的依赖注入方式

java web学习笔记-jsp篇

java学习笔记:JavaWeb应用

JAVAWEB学习笔记17

JAVAWEB学习笔记11_XML&反射

Java学习笔记:Javaweb的服务器介绍