servlet+mvc,jar包介绍及如何导入使用

一.servlet

1.什么是servlet?

Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器

2.servlet的工作模式
客户端发送请求至服务器 -->服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器–>服务器将响应返回客户端

3.servlet的开发流程
狭义上讲,servlet是servlet是java语言实现的一个类,所以我们就要根据这个类进行相应的扩展开发,开发流程如下:

  • 编写一个java类,继承HttpServlet类
  • 重写HttpServlet类的doGet方法和doPost方法
  • 配置web.xml文件,或者使用注解对servlet进行配置
    (1)对servlet进行配置
    配置servlet一共有两种方式,一种是使用web.xml文件配置,另外一种就是使用注解配置。
    1.使用web.xml文件配置
    注意,servlet的配置内容要写在webapp内部
<webapp>
<!-- 配置一个servlet -->
  <!-- servlet的配置 -->
  <servlet>
  	<!-- servlet的内部名称,自定义。尽量有意义 -->
  	<servlet-name>MyServlet</servlet-name>
  	<!-- servlet的类全名: 包名+简单类名 -->
  	<servlet-class>cn.roobtyan.servlet.FirstServlet</servlet-class>
  </servlet>
  
  
  <!-- servlet的映射配置 -->
  <servlet-mapping>
  	<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
  	<servlet-name>MyServlet</servlet-name>
  	<!-- servlet的映射路径(访问servlet的名称) -->
  	<url-pattern>/first</url-pattern>
  </servlet-mapping>
</webapp>

当你访问/first的时候,服务器自然就会把请求交给MyServlet进行处理了

2.使用@注解配置

@WebServlet(name = "LoginServlet",urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet {

然后,你在访问/login的时候,服务器同样就会将处理交由LoginServlet进行处理了

servlet映射路径的配置问题

<url-pattern>/first<url-pattern>

@WebServlet(name = "LoginServlet",urlPatterns = {"/login"})

这里面的url可不可以不这么精确的配置,用一种模糊匹配的方式,就是访问某种规则的路径的时候,统一调用一个servlet,这当然是可以的了。这就涉及到映射路径的问题了。

  • 精确匹配
    精确匹配就是我们上面用的那种方式,使用固定的url来访问这个servlet
  • 模糊匹配
    模糊匹配就是比较有意思的了,通过模糊匹配,可以让好多路径映射到同一个servlet,模糊匹配一般有如下格式
/*				任意路径都映射到这个servlet
/roobtyan/*		/roobtyan下的任意路径映射到该servlet
*.(*.do  *.action *.html)	是这样的:/任意路径.do/action/html

这里面有两点是需要注意的,一是url要么以/开头,要么以*开头,其他的都是非法的。

4.servlet的生命周期

  • 生命周期: 对象的生命周期指一个对象从被创建到被销毁的整个过程。
  • Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
    (1)加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
    (2)**初始化:**在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
    (3)请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理
    (4)**服务终止:**当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收

5.servlet接口的方法介绍
servlet中总共有5个方法

init():当Servlet第一次被请求时,初始化一个Servlet对象
service():每次请求时,service方法调用
destroy():但摧毁Service对象时。该方法调用
getServletinfo():这个方法返回Servlet的相关信息,是一段字符串
getServletConfig():这个方法返回ServletConfig对象

void init(ServletConfig config) 
//初始化方法,在Servlet被创建时执行,只执行一次
void service(ServletRequest req, ServletResponse res)
//提供服务方法, 每次Servlet被访问,都会调用该方法

void destroy() 
//销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
String getServletInfo() 
//该方法用来返回Servlet的相关信息,没有什么太大的用处,一般我们返回一个空字符串即可
public String getServletInfo() {
    return "";
}

ServletConfig getServletConfig()
//ServletConfig对象,在init方法的参数中有,而Tomcat Web服务器在创建Servlet对象的时候会调用init方法,必定会传入一个ServletConfig对象,我们只需要将服务器传过来的ServletConfig进行返回即可。

6.servlet响应页面和数据
(1)servlet响应页面
响应页面,也就是收到前端的请求响应需要跳转的页面。Servlet响应页面有转发和重定向两种方式。

  • 转发 — 也就是携带客户端发送的请求转发跳转到下一个页面,使用的是request请求对象。
//转发可以将请求中的数据带到新的页面。
//getRequestDispatcher():表示获取请求转发器的方法
//forward():表示将请求及响应对象一并转发到下一个新页面
request.getRequestDispatcher("跳转页面路径").forward(request,response);
  • 重定向 — 服务器接收到前端请求,通过响应将要跳转的页面地址响应给客户端,客户端再重新发送请求跳转到目标页面。
//重定向是将要跳转的页面路径交给前端重新发送请求跳转页面。
//相当于客户端发送了两次请求,所以原来请求中的数据就没有了。
response.sendRedirect("响应的页面路径")

(2)servlet响应数据
响应数据也是通过流的方式响应给前端,这里主要用到的是一条打印流(也就是之前JSP中的内置对象out).响应数据一般都是响应的json格式的数据,前端获取到json格式的数据就相当于拿到了一个对象,通过对象的方式去获取数据。

7.servlet的线程安全问题
一个servlet在服务器中只会存在一个实例,不论是有多少访问,都掉用的同一个实例,也就是单实例多线程的.这就存在着一定的线程安全问题,比如说,我在servlet中定义了一个全局变量,那么这个变量的值很有可能不是我期待的值,所以,在servlet中要尽量避免使用全局变量.

二.mvc

1.什么是mvc?

MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范,是将业务逻辑、数据、显示分离的方法来组织代码。

(1)Model

模型(Model):就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。
业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据 保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。

(2)View

视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。

(3)Controller

Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。

2.使用mvc的目的

使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。 其中,View的定义比较清晰,就是用户界面。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

简单流程图如下:
servlet+mvc,jar包介绍及如何导入使用_第1张图片
MVC有多种,最典型的MVC 就是 JSP+servlet+javabean 的模式

3.JavaBean

(1)JavaBean(就是一个Java类)的定义:满足一下2点 ,就可以称为JavaBean

  • public 修饰的类 ,public 无参构造
  • 所有属性(如果有) 都是private,并且提供set/get (如果boolean 则get 可以替换成is)

(2)使用层面,JavaBean分为2大类:

  • 封装业务逻辑的JavaBean (LoginDao.java封装了登录逻辑) 逻辑
    可以将jsp中的JDBC代码,封装到Login.java类中 (Login.java)
package org.lanqiao.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class LoginDao {
	public int login(String name , String pwd)
	{
		String URL="jdbc:mysql://127.0.0.1:3306/jdbc?serverTimezone=UTC&characterEncoding=UTF-8";
	    String USERNAME = "root"; //账号
	    String PWD = "123456"; //密码
	    Connection conn = null;
	    PreparedStatement pstmt = null;
	    ResultSet rs = null;
	    
		try{
			//导入驱动,加载具体的驱动类
			Class.forName("com.mysql.cj.jdbc.Driver");
			
			//连接数据库
			conn = DriverManager.getConnection(URL,USERNAME,PWD);
			
			//发送sql语句
			// String sql = "select count(*) from login where name = ? and pwd = ?"; //报错,找不到原因
			
			String sql = "select * from login";
			pstmt = conn.prepareStatement(sql);
//			pstmt.setString(1, name);
//			pstmt.setString(2, pwd);
			
			//执行查询,获取结果集
			rs = pstmt.executeQuery(sql);
			
			//处理结果集
			int count=0;
			while(rs.next()){
				String daoName = rs.getString("name");
				String daoPwd = rs.getString("pwd");
				if(name.equals(daoName) && pwd.equals(daoPwd)){
					count = 1;
					break;
				}
			}
				
			return count;
			
			}catch(Exception e){
				e.printStackTrace();
				return -1;
			}finally{
					try {
						//关闭连接
						if(rs!=null) rs.close();
						if(pstmt!=null) pstmt.close();
						if(conn!=null) conn.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
			}
	}
		
}


  • 封装数据的JavaBean (实体类,Student.java Person.java ) 数据
    对应于数据库中的一张表
package userLogin;

public class Login {
	
	private String name;
	private String pwd;
	
	public Login() { //无参构造
		super();
		// TODO Auto-generated constructor stub
	}
	
	public Login(String name, String pwd) { //有参构造
		super();
		this.name = name;
		this.pwd = pwd;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getPwd() {
		return pwd;
	}
	
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
}

JavaBean在Java项目中更多的是封装数据

4.一个实现了MVC架构模式的简单javaweb项目(Maven类型的项目)如下图所示。
servlet+mvc,jar包介绍及如何导入使用_第2张图片

三.jar包的介绍

1.什么是jar包?

jar包就是 Java Archive File,顾名思义,它的应用是与 Java 息息相关的,是 Java 的一种文档格式,是一种与平台无关的文件格式,可将多个文件合成一个文件。jar 包与 zip 包非常相似——准确地说,它就是 zip 包,所以叫它文件包。jar 与 zip 唯一的区别就是在 jar 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,该文件是在生成 jar 文件的时候自动创建的,作为jar里面的"详情单",包含了该Jar包的版本、创建人和类搜索路径Class-Path等信息,当然如果是可执行Jar包,会包含Main-Class属性,表明Main方法入口,尤其是较为重要的Class-Path和Main-Class。

简而言之,jar包是JAVA 语言专用的压缩包,用来存放编译好的代码。

2.为什么使用jar包?
(1)安全,可以对jar包进行数字签名,只让能够识别数字签名的用户使用里面的东西。
(2)加快下载速度。
(3)压缩,使文件变小,与ZIP压缩机制完全相同。
(4)包封装。能够让JAR包里面的文件依赖于统一版本的类文件。
(5)可移植性,能够在各种平台上直接使用。
(6)把一个JAR文件添加到系统的classpath环境变量之后,java通常会把这个JAR文件当做一个路径来处理。通常使用jar命令来压缩,可以把一个或多个路径全部压缩成一个JAR文件。

四.jar包的导入使用

1.jar包的创建(含有多个类的jar,类之间存在调用关系)
首先,我们先写存在调用关系的两个类的Java代码

package com.bluemsun;

public class Parents {

    void greeting(){
        System.out.println("Hello!");
    }
}

package com.bluemsun;

class Kid {
    public static void main(String[] args) {
        Parents zhang = new Parents();
        zhang.greeting();
    }
}

(1)通过jdk创建
在命令行编译,生成与这两个类相对应的.class字节码文件
servlet+mvc,jar包介绍及如何导入使用_第3张图片
在src根目录下执行如下指令

jar -cvf welcome.jar com/bluemsun/Kid.class com/bluemsun/Parents.class

c表示要创建一个新的jar包,v表示创建的过程中在控制台输出创建过程的一些信息,f表示给生成的jar包命名
servlet+mvc,jar包介绍及如何导入使用_第4张图片
使用如下动态指令执行,不需要修改META-INF/MANIFEST.MF,即不需要指定main函数

java -cp welcome.jar com.bluemsun.Kid

servlet+mvc,jar包介绍及如何导入使用_第5张图片
运行成功
(2)使用idea打jar包

  • 不使用Maven直接打jar包
    File -->Project Structure -->Artifacts --> Jar --> From module with dependencies
    servlet+mvc,jar包介绍及如何导入使用_第6张图片
    servlet+mvc,jar包介绍及如何导入使用_第7张图片
    Build --> Build Artifacts
    servlet+mvc,jar包介绍及如何导入使用_第8张图片
    这时我们去刚才相应的jar包输出目录发现已经有了对应的包
    servlet+mvc,jar包介绍及如何导入使用_第9张图片
  • 使用Maven打jar包

当你的Project中使用了Maven时,可以直接在Lifecycle中执行打包
双击package后我们即可以发现在target目录下便生成了一个对应的jar包,这里jar包和刚才方法一其实是一样的,只不过我们这次用Maven生成的。

2.jar包的导入和使用
File–>Project Structure–>Modules–>Dependencies,然后点击“+”,选择“JARs or directories”,选择要上传的jar包,然后 Apply-ok
servlet+mvc,jar包介绍及如何导入使用_第10张图片
测试导入的包是否可用:
servlet+mvc,jar包介绍及如何导入使用_第11张图片
在External Libraries中有导入的jar包,且在类中能够引用jar包中的方法

3.大致讲解一下jar的运行过程

jar 运行过程和类加载机制有关,而类加载机制又和我们自定义的类加载器有关,现在我们先来了解一下双亲委派模式。
java 中类加载器分为三个:
BootstrapClassLoader 负责加载 ${JAVA_HOME}/jre/lib 部分 jar 包
ExtClassLoader 加载 ${JAVA_HOME}/jre/lib/ext 下面的 jar 包
AppClassLoader 加载用户自定义 -classpath 或者 Jar 包的 Class-Path 定义的第三方包
类的生命周期为:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using) 和 卸载(Unloading)七个阶段。
当我们执行 java -jar 的时候 jar 文件以二进制流的形式被读取到内存,但不会加载到 jvm 中,类会在一个合适的时机加载到虚拟机中。类加载的时机:
1.遇到 new、getstatic、putstatic 或 invokestatic 这四条字节码指令时,如果类没有进行过初始化,则需要先对其进行初始化。这四条指令的最常见的 Java 代码场景是使用 new 关键字实例化对象的时候,读取或设置一个类的静态字段调用一个类的静态方法的时候。
2.使用 java.lang.reflect 包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
3.当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
4.当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类。
当触发类加载的时候,类加载器也不是直接加载这个类。首先交给 AppClassLoader ,它会查看自己有没有加载过这个类,如果有直接拿出来,无须再次加载,如果没有就将加载任务传递给 ExtClassLoader ,而 ExtClassLoader 也会先检查自己有没有加载过,没有又会将任务传递给 BootstrapClassLoader ,最后 BootstrapClassLoader 会检查自己有没有加载过这个类,如果没有就会去自己要寻找的区域去寻找这个类,如果找不到又将任务传递给 ExtClassLoader ,以此类推最后才是 AppClassLoader 加载我们的类。这样做是确保类只会被加载一次。通常我们的类加载器只识别 classpath (这里的 classpath 指项目根路径,也就是 jar 包内的位置)下 .class 文件。jar 中其他的文件包括 jar 包被当做了资源文件,而不会去读取里面的 .class 文件。但实际上我们可以通过自定义类加载器来实现一些特别的操作。

以上就是第四周的预习博客,内容实在有点多,所以只做了一些粗略的了解。

课后总结

通过学长的讲解,我了解了一些预习博客中不完善的知识点,很高兴又学到了很多知识。
学长对servlet的讲解非常详细,总结了我又学到的几点知识

1.符合servlet规范的webapp开发步骤

在webapps目录下新建一个目录crm–>在webapp的根下新建一个目录WEB-INF–>在WEB-INF目录下新建一个目录:classes–>在WEB-INF目录下新建一个目录:lib–>在WEB-INF目录下新建一个文件:web.xml

2.请求协议:请求行,请求头,空白行,请求体

3.响应协议:状态行,响应头,空白行,响应体

4.Session机制

(1)域的大小:应用域,会话域,请求域
使用原则:尽量使用作用范围小的域
(2)在请求中,得到会话对象
不同的人请求返回的session对象不同,同一个人请求返回的对象相同。
(3)销毁session对象

session.invalidate()
//在登出或者过期的时候可以选择销毁

5.Cookie

(1)cookie最终是保存在浏览器客户端的,可以保存在运行内存中(暂时保存),也可以保存在硬盘文件中(永久保存)。

(2)cookie与session

两种机制都是为了保存会话的状态。
cookie是将会话的状态保存在浏览器客户端上。
session是将会话的状态保存在服务器端上。

(3)cookie失效的方法

  • 设置cookie期限
  • 在客户端浏览器上手动清除cookie
  • 改密码

你可能感兴趣的:(java,servlet)