Servlet项目创建总体流程:
1、建Maven项目(导入Maven依赖)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
2、编写Servlet项目(首先编写一个普通类,然后实现HttpServlet接口)
重写doGet和doPost方法或者只重写service方法
3、编写Servlet的映射(在web.xml中)
<!--注册Servlet,一个Servlet对应一个Servlet-mapping-->
<servlet>
<servlet-name>helloservlet</servlet-name> <!--名字随便取,但是要和mapping中的对应-->
<servlet-class>com.su.servlet.MyServlet</servlet-class> <!--servlet类的全限定名-->
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>helloservlet</servlet-name>
<url-pattern>/hello</url-pattern> <!--自己定义一个请求的路径-->
</servlet-mapping>
为什么需要映射:我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接Web服务器,所以需要web服务器中注册我们写的Servlet,还需给他一个浏览器能够访问的路径。
4、配置Tomcat,并启动
整体逻辑: Servlet是由web服务器调用(tomcat)
浏览器向web服务器发送Http请求,web容器产生请求和响应两个对象
通过浏览器输入的访问地址找到web.xml中配置的servlet,再找到配置的servlet中的对应的类。
ServletContext
web容器在启动的时候,会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用
- 共享数据
在servlet中保存的数据,可以在另外一个servlet中拿到
- 获取初始化参数
- 请求转发
A找到B,B找到C,C再转发给B,B再转发给A,A始终没有看到C,所以转发的时候路径不会发生改变 - 读取properties文件。通过getServletContexr().getResourcesAsStream(文件的相对路径)将文件转为流,再用properties加载。
web服务器接收到客户端的请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;
- 如果要获得客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息,找HttpServletResponse
重定向: 一个web资源(B)收到客户端(A)请求后,他(B)会通知客户端(A)去访问另外一个web资源(C),这个过程叫重定向
JSP
- 四个可以保存数据的内置对象:
- pageContext:保存的数据只在一个页面中有效
- request:保存的数据只在一次请求中有效,请求转发会携带这个数据
- session:保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
- application(相当于Servlet中的servletContext):保存的数据只在服务器中有效,从打开服务器到关闭服务器
- <%=%>和${}的区别:如果值不存在,前者会输出null,后者会过滤掉,不输出
- JSTL表达式:为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样
JavaBean
- javaBean通常被称为实体类,一般用来和数据库的字段做映射(ORM);
ORM:对象关系映射
- 表–>类
- 字段–>属性
- 行记录–>对象
- JavaBean有特定的写法:
- 必须有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
MVC三层架构
什么是MVC:Model view Controller – >(模型,视图,控制器)
Model
- 业务处理:业务逻辑(Service层)
- 数据持久层:CRUD(Dao层)
View
- 展示数据
- 提供链接发起Servlet请求(a,form,img…)
Controller(Servlet)
- 接收用户的请求:(req:请求参数、Session信息…)
- 交给业务层处理对应的代码
- 控制视图的跳转
例子(登陆操作): 登陆–>接受用户的登陆请求–>处理用户的请求(获取用户的参数,username,password)–>交给业务层处理登陆业务(判断用户名密码是否正确:事务)–> Dao层查询用户名和密码是否正确
Filter(重点,和Servlet类似,实现过滤器接口,导java.servlet的包)
- Filter:过滤器,用来过滤网站的数据,可以有多个过滤器;
- 处理中文乱码
- 登陆验证…
- Filter实现步骤
- 创建项目、导包
- 编写过滤器
- 在web.xml中配置Filter,和Servlet类似(filter + filter-mapping)
- 实现接口的三个方法,init()方法是随web服务器启动,就已经启动了,随时等待过滤对象出现;destory()方法是随web服务器关闭的时候,过滤会销毁;重点是doFilter()方法,要在这个方法中调用chain.doFilter(),才可以让请求继续走,如果不写,程序到这里就被拦截停止,需要注意以下两点:
- 过滤中的所有代码,在过滤特定请求的时候都会执行
- 必须要让过滤器继续通行
Tip
- classpath:类路径,main下的java和resources里的文件通过maven编译后会放在target里的classes中,注意如果java中有其他类型的文件,要在pom.xml中配置<build过滤。
- 响应状态码:200–>请求响应成功,3xx–>请求重定向,4xx–>找不到资源,5xx–>服务器代码错误,502–>网关错误
- 重定向和转发的区别
- 相同点:页面都会跳转
- 不同点:重定向Url会发生变化
- Session和cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户独占Session中,服务端保存(保存重要的信息,减少服务资源的浪费)
- Session对象由服务端创建
Session使用场景
- 保存一个登陆用户的信息
- 购物车信息
- 在整个网站中经常会使用的数据,我们将它保存在Session中
- EL表达式: ${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
- JDBC固定步骤
- 加载驱动 – Class.forName(数据库驱动)
- 连接数据库 – DriverManager.getConnection(url, usename, password),返回Connection对象,即代表了数据库
- 向数据库发送SQL的对象Statement – connection.createStatement(),但这是不安全的,会导致SQL注入问题,一般使用preparedStatement
- 编写SQL
- 执行SQL – statement.excute…,具体方法根据SQL语句来执行