一、基本概念
在学习了最基础的HelloJavaweb项目后,我们需要进一步学习更强大的功能,从而满足一个网站的最基本的功能需求
二、Maven工具
作用:JavaWeb开发中必须要使用到大量的jar包,Maven可以实现通过项目依赖,自动下载、导入jar包,以及此jar包下所有依赖的jar包
核心思想:依赖大于配置
问题:配置文件有时候无法被导出
三、Servlet
- 什么是Servlet
开发动态Web的一门技术
Servlet 是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。 - Servlet处理请求图解
- POST、GET
请求行,post和get达成的效果一致,不过在请求的过程中有些许不同:
doGet:请求携带的参数较小,但是比较高效;会在URL地址栏中显示数据内容,不安全
doPost:携带的参数无限制,因此低效;不会在URL中显示数据内容,安全
- 响应状态码
404:找不到目标资源
5**:服务器代码错误 —— 502:网关错误
200:请求状态成功
3**:请求重定向
四、ServletContext对象
web容器启动时,为每一个web程序创建一个ServletContext对象,作用在所有servlet 之上,代表当前;
作用:
- 数据共享
可做为一个容器,servlet1存入数据,servlet2取出数据,达成数据共享
若未存入,取出值为null
//存入一个变量名为test的String类型值
this.getServletContet().setArrtibute("test","data");
//取出
String str = this.getServletContet().getArrtibute("test");
- 请求转发
等同于request请求转发
this.getServletContext().getRequestDispatcher("/get").forward(req,resp);
- 获取资源(读取文件)
//读取resources目录资源
//InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
//读取Java目录资源——会遇到资源导入问题
//InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/xawl/servlet/ab.properties");
//用此方法解决中文乱码问题
//将资源转换为流
BufferedInputStream in =new BufferedInputStream(
this.getServletContext().getResourceAsStream(
"/WEB-INF/classes/com/xawl/servlet/ab.properties"));
//新建Properties对象
Properties prop = new Properties();
//Properties对象读取流
prop.load(new InputStreamReader(in,"UTF-8"));
//获取资源文件值(根据键,获取值)
String name =prop.getProperty("name");
String age = prop.getProperty("age");
- 获取初始化参数
<!--xml设置初始化值-->
<context-param>
<param-name>name</param-name>
<param-value>value</param-value>
</context-param>
//Java获取初始化值
String str = this.getServletContet().getInitParmeter("name");
五、Request、Response对象
Web服务器收到Http请求时,针对此请求,分别创建对象:
- 响应:HttpServletResponse
- 用于给客户端响应信息,给浏览器发送数据的方法
- 负责向浏览器发送响应头
- 响应状态码
- 实现重定向(url发生变化)
//重定向
response.sendRedirect("/path");
- 请求:HttpServletResquest
代表客户端的所有请求
- 获取前端传递的参数
<form action="{pageContext.request.contextPath}/path" method="get">
//获取前端name变量的值
request.getParameter("name");
//获取多选框的值
request.getParameterValues("names");
- 请求转发
//请求转发
request.getRequestDispatcher("/test.jsp").forward(req,resp);
六、Cookie、Session
会话
用户打开浏览器——操作——关闭浏览器:此过程为一个会话
网站如何知道你来的次数,如何知道下一次来的还是你?——确定身份
①服务器给客户端一个信件,每次访问带着信件:Cookie
②服务器登记信息,下次来主动匹配:Session
- Cookie:客户端技术,默认有效期存在于一次会话中,浏览器关闭,Cookie被删除(部分浏览器可以恢复会话)
1. 服务器给客户端发送Cookie信息,可设置有效期
2. 发送给客户端
3. 服务器获取http请求的Cookie,若不存在,重复1、2步骤
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取Cookie
Cookie cookies[] = req.getCookies();
//判断示符携带cookie
if(cookies!=null) {
//cookie存在多个,遍历匹配
for (Cookie cookie : cookies) {
if (cookie.getName().equals("lastTime")) {
//获取cookie value值,编码对应解码
String str = URLDecoder.decode(cookie.getValue(), "utf-8");
resp.getWriter().println("欢迎访问本网站,上次访问时间为:" + str);
}
}
}
else{
writer.println("第一次访问本网站");
}
Date date = new Date();
SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String time = simple.format(date);
//编码,否贼会报错
Cookie cookie = new Cookie("lastTime", URLEncoder.encode(time,"utf-8"));
//发送给客户端的Cookie,打包发送
//设置有效期
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
- Session:服务器技术,一个Session独占一个浏览器,不关闭服务器,即存在
- 获取Session
Object str = req.getSession().getAttribute("str");
- 使用其存值
//可存入对象
req.getSession().setAttribute("message",date);
- 设置有效期和手动注销
<!-- 设置Seession的有效时间-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
//移除Session
HttpSession session = req.getSession();
req.removeAttribute("message");
session.invalidate();
- Session和Cookie总结
Cookie将数据置于浏览器保存
Session将数据置于服务器保存
七、JSP
可嵌入Java代码、HTML代码
原理:Tomcat内有一个index.jsp.java,被映射至工作目录,其本质上还是Servlet,经转换后转换为Java类
- 内置对象
这四个用于存、取数据,作用域从小到大
pageContext 页面内有效
request 一次请求有效,通过请求转发可携带此数据
session 一次会话有效,从浏览器打开到关闭
application 所有servlet之上,服务器有效,从服务器打开到关闭
.
config ServletConfig服务器配置,可得到初始化参数
out 输出流
page 当前页
response 服务器给用户响应信息
exception 异常
- 基础语法
<% java %> 脚本片段——可用于内置Java语句
<%= java %> 变量表达式——程序输出到客户端
<%! java %> 声明 ——此处代码会被编译到Java类中,其他默认处于jspservoce()方法中
<%@ %>指令
例:<%@ page errorpage=""%> 指定跳转
<%@ include file=“test.jsp”%>引入某个页面,合并为一个
<jsp:include page=""> 拼接页面,本质为多个
- JSPL标签、EL表达式
此处省略,可查资料
八、MVC三层架构
三层:Model:模型层 View:视图层 Controller:控制层
View:展示数据,提供链接,发起请求
Model:业务逻辑层(service)+数据持久层(dao)
Controller:接受用户请求,交付给业务层,并处理业务层代码,控制视图跳转
九、过滤器、监听器
- 过滤器
可以实现过滤网站的数据
使用:编写过滤类,实现Filter接口
重写init()、doFilter()、destroy()方法
配置xml,确定过滤范围
//过滤格式,防止乱码
public class FilterDemo implements Filter {
//过滤器初始化
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
}
//过滤器运行时的触发动作
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
System.out.println("过滤器启动");
//谨记,一定得写,使过滤器继续执行下去,不然会卡住
chain.doFilter(request,response);
}
//过滤器关闭时触发时的动作
public void destroy() {
System.out.println("过滤器销毁");
}
}
<!-- 配置过滤器-->
<filter>
<filter-name>filter</filter-name>
<filter-class>com.dcits.easys.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<!--过滤器生效在/f文件夹下所有文件中-->
<url-pattern>/f/*</url-pattern>
</filter-mapping>
注解配置实现:@WebFilter("/f/*")
- 监听器:当发生某些事件时触发,执行预设动作
//监听器测试
public class Test implements HttpSessionListener {
//创建Session时触发
public void sessionCreated(HttpSessionEvent se) {
System.out.println("新增用户");
}
//销毁Session时触发
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("注销用户");
}
}
<!-- 配置监听器-->
<listener>
<listener-class>com.dcits.easys.listener.Test</listener-class>
</listener>
十、JDBC
JDBC连接数据库步骤
- Maven导入依赖(导包)mysql
- 加载驱动 Class.forName(“Driver”);
- 连接数据库 getConnection(url,name,password);
- 编写SQL语句,预编译SQL:
- 执行SQL:
- 关闭连接:
例:
public class JDBCDemo {
public static void main(String[] args) throws SQLException {
//配置信息 useUnicode=true&characterEncoding=utf-8 解决中文乱码
String url = "jdbc:mysql://localhost:3306/webstore?useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
Connection connection = null;
//加载驱动
try{
Class.forName("com.mysql.jdbc.Driver");
}
catch (Exception e){
System.out.println("驱动加载失败");
}
try{
//代表数据库,进行连接
connection = DriverManager.getConnection(url, username, password);
}
catch (Exception e){
System.out.println("连接失败");
}
//编写SQL
String sql = "select empno from emp;";
//预编译
PreparedStatement pre = connection.prepareStatement(sql);
//执行查询SQL 返回ResultSet结果集对象
ResultSet resultSet = pre.executeQuery();
while(resultSet.next()){
System.out.print("empno:" + resultSet.getObject("empno"));
}
//关闭连接,释放资源
resultSet.close();
pre.close();
connection.close();
}
}
sql注入:
//使用?预留位置,预编译后进行插入
String sql = "select empno from emp where id = ? and name = ?;";
PreparedStatement pre = connection.prepareStatement(sql);
pre.setInt(1,"1");
pre.setString(2,"张三");
在学习了基本的JDBC操作后,就可以实现对数据库的简单增删查改操作
总结:根据学习,后端和前端的交互无非传输数据、转发页面,后端和数据库的交互也就是CRUD(增删改查),我们着重需要编写的是业务逻辑上的代码,因此,根据所学的JavaWeb,我们可以开发出一个最基本的网站