java的进阶学习-第二章:反射机制和Servlet技术

该博客围绕Java开发展开,介绍了反射机制,可在程序运行时动态创建对象、获取属性和方法。还阐述了Web项目结构、Tomcat服务器配置与使用。重点讲解Servlet开发,包括手动和工具开发方式、执行过程、生命周期,并通过用户登录功能展示了Servlet的入门应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、反射机制:

1.1 反射机制创建对象:

1.2 反射机制获取属性名和值:

1.3 反射机制获取方法:

1.4 反射的实例:

2.1 软件结构

2.2 服务器:

2.3 web项目的结构:

2.4 Tomcat服务器软件(中间件):

2.4.1 配置:

2.4.2 Tomcat的使用:

3.1 初始Servlet:

3.2 Servlet手动开发入门程序:

3.3 Servle的工具开发:

四、Servelt的原理:

4.1 Servlet的执行过程:

4.2 Servlet的生命周期:

五、Servlet的入门应用:

5.1 页面开发:

5.2 Servlet后端开发:


Java基础

Web前端:

页面结构:html

Servlet、jsp(Java Server Page)=html+java

页面样式:css(Cascading Style Sheet,层叠样式表)

页面交互:js(javascript)、jQuery、AJAX

XML文件

MySQL数据库

JDBC(Java DataBase Connectivty)

JavaWeb项目:

一、反射机制:

在程序运行期间能够动态创建对象,获取对象的属性。

User user = new User();

1.1 反射机制创建对象:

public class Reflect01 {

    /**

     * 利用反射机制动态创建对象

     */

    public static void main(String[] args) throws Exception {

       // 读取User类的字节码文件,创建一个字节码对象

       Class<?> clazz = Class.forName("com.bwhuili.entity.User");

       // 利用字节码对象创建User对象

       User user = (User) clazz.newInstance();  // 相当于调用无参构造器

       // 通过构造器创建对象

       // Class<?>[] parameterTypes = { String.class, String.class,

       // String.class,

       // Boolean.class, Double.class, Integer.class };

       Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);

       // (相当于调用有参构造器)

       User user2 = (User) constructor.newInstance("张三");

       System.out.println(user);

    }

}

1.2 反射机制获取属性名和值:

public class Reflect02 {

    /**

     * 反射机制获取属性名和值

     */

    public static void main(String[] args) throws Exception {

       String className = "com.bwhuili.entity.User";

       Class<?> clazz = Class.forName(className);

       User user = (User) clazz.newInstance();  // 动态创建User对象

       // 获取对象中的所有属性名称

       Field[] fields = clazz.getDeclaredFields();

       // 使用增强for循环遍历数组

       for (Field field : fields) {

           // 设置强制访问

           field.setAccessible(true);

           // 属性名称

           String name = field.getName();

           // 属性值

           Object value = field.get(user);

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

       }

    }

}

1.3 反射机制获取方法:

public class Reflect03 {

    /*

     * 反射机制获取方法

     */

    public static void main(String[] args) throws Exception {

       Class<?> clazz = Class.forName("com.bwhuili.entity.User");

       User user = (User) clazz.newInstance();  // 创建User对象

       // 获取user对象中的setSalary()方法

       Method method = clazz.getDeclaredMethod("setSalary", Double.class);

       // 相当于调用setSalary()方法,把9700.00赋给salary

        method.invoke(user, 9700.00);

       System.out.println(user);

    }

}

1.4 反射的实例:

public class ReadXMLFile<T> {

    public List<T> read(String xmlName, T t) throws Exception {   // 读取users.xml

       List<T> list = new ArrayList<T>();

       // 1.创建一个xml解析器对象

       SAXReader reader = new SAXReader();

       // 2.读取xml文件,返回Document对象

       Document document = null;

       try {

           document = reader.read(new File(xmlName));

       } catch (DocumentException e) {

           e.printStackTrace();

       }

       // 3.解析

       Element root = document.getRootElement();  // 根节点

       Iterator<Node> iterator = root.nodeIterator();   // 子节点的迭代器

       while (iterator.hasNext()) {

           Node node = (Node) iterator.next();

           if (node instanceof Element) {

              Element element = (Element) node;

              /* User user = new User(); */

              Class<?> clazz = t.getClass();   // 获取到泛型T的字节码文件

              Object object = clazz.newInstance();   // 利用反射动态创建对象

              Iterator<Node> iterator2 = element.nodeIterator();

              while (iterator2.hasNext()) {

                  Node node2 = iterator2.next();   // 叶子节点

                  String name = node2.getName();   // 节点名称

                  if (node2 instanceof Element) {

                     Element element2 = (Element) node2;

                     String value = element2.getText();   // 节点中的值

                     // 调用setXXXX(...)给对象obejct初始化

                     // 拼接set方法,组成Method类型的对象,调用invoke

                     String methodName = "set"

                            + Character.toUpperCase(name.charAt(0))

                            + name.substring(1);   // set方法名称

                     String type = element2.attributeValue("type");  // set方法的参数类型

                     // 利用反射机制获取set方法,并调用Method的invoke给对象初始化

                     Method setMethod = clazz.getMethod(methodName,

                            Class.forName(type));

                     if ("java.lang.String".equals(type)) {

                         setMethod.invoke(object, value);

                     } else if ("java.lang.Boolean".equals(type)) {

                         setMethod.invoke(object, "1".equals(value) ? true

                                : false);

                     } else if ("java.lang.Double".equals(type)) {

                         setMethod.invoke(object, Double.valueOf(value));

                     } else if ("java.lang.Integer".equals(type)) {

                         setMethod.invoke(object, Integer.parseInt(value));

                     } else {

                     }

                  }

              }

              list.add((T) object);

           }

       }

       return list;

    }

}

  • web理论基础和开发工具:

2.1 软件结构

C/S:Client-Server

B/S:Browser-Server

JavaWeb属于B/S结构。

2.2 服务器:

从物理的角度,就是PC机(8核,8G,256G)。

Web服务器:在PC机上安装web服务软件。

Web服务器软件:

作用:把本地的资源共享给外部使用。

Tomcat:Apache,免费,支持J2EE开发。

Jetty:Scala开发使用比较多。

WebLogic:BEA公司

JBoss:收费

WebSphare:IBM

数据库服务器:安装数据库服务软件的服务器。

2.3 web项目的结构:

注意:

1、src和WebRoot可以在创建工程的时候自定义,不同的工具(如Intillij IDEA)新建的web项目也名称会有不同。

2、WEB-INF目录中的文件资源不能通过浏览器直接访问。

2.4 Tomcat服务器软件(中间件):

2.4.1 配置:

2.4.2 Tomcat的使用:

1、项目发布和Tomcat的启停:

发布:

启动/停止/重启:

2、url:

统一资源定位符

http://localhost:8080/Day28_Demo/index.jsp

http://      访问协议

localhost        本地域名,指代127.0.0.1

8080      Tomcat服务的端口号

Day28_Demo      web应用的发布名称,默认情况下到Tomcat的webapps目录下

Index.jsp      资源的名称

3、Tomcat的目录结构:

http://localhost:8080/实际上访问的是Tomcat路径之下的ROOT/index.jsp。如果发布项目时,不希望在浏览器url中出现项目名称,可以直接把项目的发布路径改成ROOT

  • Servlet的开发:

3.1 初始Servlet:

静态资源:当用户多次访问这个资源,资源的代码不会发生变化,比如html。

动态资源:当用户多次访问这个资源,资源的代码可能发生变化。

Servlet:用java语言编写的动态资源开发技术。

3.2 Servlet手动开发入门程序:

1、定义一个HelloWorldServlet类,继承HttpServlet,重写doGet()和doPost方法:

public class HelloWorldServlet extends HttpServlet {

    /*

     * 如果浏览器的url没有指定请求方式,默认是get,调用doGet()方法

     */

    @Override

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       response.setCharacterEncoding("UTF-8");

       // 向浏览器输出内容

       response.getWriter().write(

              "Hello world!这是我的第一个Servlet程序,当前的时间为:" + new Date());

    }

    @Override

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       doGet(request, response);

    }

}

2、在web.xml文件中配置Servlet:

<!-- 配置HelloWorldServlet -->

  <servlet>

    <!-- Servlet程序的名称 -->

    <servlet-name>HelloWorld</servlet-name>

    <!-- Servlet的实际包名和类名 -->

    <servlet-class>com.bwhuili.servlet.HelloWorldServlet</servlet-class>

  </servlet>

  <!-- 配置Servlet的映射 -->

  <servlet-mapping>

    <!-- Servlet程序的名称 -->

    <servlet-name>HelloWorld</servlet-name>

    <!-- Servlet的访问路径 -->

    <url-pattern>/hello</url-pattern>

  </servlet-mapping>

3、发布项目到Tomcat

4、启动Tomcat服务器:

http://localhost:8080/Day28_Demo/hello

3.3 Servle的工具开发:

在创建Servlet程序时,直接new->Servlet,可以在弹出框中填写Servlet的类名、包名、修改url和指定要重写的方法(如doGet()doPost()等)。(Display Name和Description的内容一般设置为空)

默认会自动生成指定的Servlet类以及重写指定的方法,会在web.xml文件中配置相应的Servlet。

四、Servelt的原理:

4.1 Servlet的执行过程:

1、Tomcat服务器启动的时候,会读取web.xml文件,并且把其中的配置信息写入内存;

2、当在浏览器通过url访问这个Servlet时,会去内存中找该Servlet对应的配置信息;

3、调用servlet中的方法(如果使用了form表单提交,method指定的请求方式为get)(默认)则调用doGet()方法,请求方式为post则调用doPost()方法;否则直接调用doGet()方法)

Java程序的总入口:main方法

Javaweb项目的总入口:web.xml

Javaweb项目用户操作的入口:页面(jsp/html/Servlet)

4.2 Servlet的生命周期:

Servlet的加载----->实例化----->服务------>销毁

构造方法:创建Servlet对象的时候调用,默认情况下,是在第一次访问该Servlet时创建一个对象,只调用一次。(Servlet对象在Tomcat中是单例的)

Init()方法:创建完Servlet对象之后调用一次,只会调用一次

service()方法:每次从浏览器发出请求时调用,调用多次。从表面看,就是调用doGet()或doPost()方法,具体调用哪一个是由请求方式决定。

destroy()方法:销毁对象的时候调用。停止Tomcat服务器时会销毁,只会调用一次

五、Servlet的入门应用:

实现一个用户登录功能。

5.1 页面开发:

编写登录表单,设置整个页面的样式(css),实现表单提交的校验(js)

Html:

<!DOCTYPE html>

<html>

  <head>

    <title>登录页面</title>

   

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="this is my page">

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

   

    <link rel="stylesheet" type="text/css" href="css/style.css">

    <script type="text/javascript" src="js/login.js"></script>

  </head>

  <body>

    <form action="login.do" method="post" onsubmit="return check();">

        <table border="1" cellspacing="0" width="400" align="center" id="table">

           <tr>

               <td>

                  <table border="0" cellspacing="0" cellpadding="10">

                      <tr>

                          <td width="100" class="title">账号:</td>

                          <td width="300"><input type="text" name="account" id="account"/><i style="color:red;" id="msg1"></i></td>

                      </tr>

                      <tr>

                          <td class="title">密码:</td>

                          <td><input type="password" name="password" id="password"/><i style="color:red;" id="msg2"></i></td>

                      </tr>

                      <tr>

                          <td class="title">确认密码:</td>

                          <td><input type="password" name="rePassword" id="rePassword"/><i style="color:red;" id="msg3"></i></td>

                      </tr>

                      <tr>

                          <td colspan="2" align="center">

                             <input type="submit" value="登录"/>&nbsp;&nbsp;

                             <input type="reset" value="取消"/>

                          </td>

                      </tr>

                   </table>

               </td>

           </tr>

        </table>

    </form>

  </body>

</html>

css/style.css

.title{

    text-align: right;

}

#table{

    margin-top:200px;

}

js/login.js

function check(){

    document.getElementById("msg1").innerHTML = "";

    document.getElementById("msg2").innerHTML = "";

    document.getElementById("msg3").innerHTML = "";

    //分别获取三个input输入框对应的标签

    var accountEle = document.getElementById("account");

    var passwordEle = document.getElementById("password");

    var rePasswordEle = document.getElementById("rePassword");

    //分别获取三个输入框的值

    var account = accountEle.value.trim();  //trim()去掉首尾的空格

    var password = passwordEle.value.trim();

    var rePassword = rePasswordEle.value.trim();

    if(account==null||account==""){

       document.getElementById("msg1").innerHTML = "请输入...";

       accountEle.focus();

       return false;

    }

    if(password==null||password==""){

       document.getElementById("msg2").innerHTML = "请输入...";

       passwordEle.focus();

       return false;

    }

    if(password!=rePassword){

       document.getElementById("msg3").innerHTML = "密码不一致!";

       rePasswordEle.focus();

       return false;

    }

    return true;

}

5.2 Servlet后端开发:

AdminServlet.java

public class AdminServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       doPost(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       /*

        * 登录校验:

        * 1.接收页面发送到服务器的数据(账号、密码)

        * 2.从数据库根据账号查询用户

        * 3.看从数据库中查询的到的用户数据是否跟输入一致(有可能用户不存在;有可能用户存在,但是密码不一致;有可能用户存在,并且密码一致)

        * 4.根据校验的结果跳转页面(?)

        */

       request.setCharacterEncoding("UTF-8");

       // 1、接收页面数据

       String account = request.getParameter("account").trim();  // trim()去掉首尾的空格

       String password = request.getParameter("password").trim();

       // System.out.println("acc:" + account + ",pwd:" + password);

       // 2、考虑到目前没有数据库,可以暂时定义List集合虚拟一个数据库

       List<Admin> admins = new ArrayList<Admin>();

       admins.add(new Admin("张三", "1234"));

       admins.add(new Admin("俊杰", "4321"));

       admins.add(new Admin("ouyang12", "8866"));

       Admin dbAdmin = null;   // 存储从数据库中查询到的账户对应的用户

       for (Admin ad : admins) {

           if (account.equals(ad.getAccount())) {  // 从数据库中找个该账号对应的用户

              dbAdmin = ad;

           }

       }

       // 3、校验:

       if (dbAdmin == null) { // 账号不存在

           System.out.println("账号不存在!");

       } else {

           if (password.equals(dbAdmin.getPassword())) {// 账号存在,并且密码正确

              System.out.println("登录成功!");

           } else {

              System.out.println("密码错误!!!");

           }

       }

    }

}

web.xml

<servlet>

    <servlet-name>AdminServlet</servlet-name>

    <servlet-class>com.bwhuili.servlet.AdminServlet</servlet-class>

  </servlet>

<servlet-mapping>

    <servlet-name>AdminServlet</servlet-name>

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

  </servlet-mapping>

注意问题:

1、写一段就调试一段,看看效果。

2、注重思路,再逐步细化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逼哥很疯狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值