本文目录
一、初步配置Servlet
1、配置Servlet的步骤
创建一个普通的maven工程
在项目名称上右键,选择添加框架支持
勾选Web Application 里面的版本号默认即可,保持勾选Create web.xml,然后确定
如果添加成功就会出现一个带有蓝色圆点的web文件夹
在pom文件中导入servlet依赖的坐标后,刷新pom文件,如果导入成功就可以在外部库中发现servlet的jar包
这样我们就可以在idea中使用servlet了
2、配置tomcat服务器
项目需要靠tomcat服务器来运行,tomcat实际上就是Java写的一个程序
先将这样的一个tomcat压缩包解压,最好解压到的路径不包含中文,否则可能会出问题
(如果没有获取tomcat的方法,可以留言找我要~~)
点击idea界面右上角的Add Configuration
进入这样的一个界面后,点击+号,滚轮往下滑找到Tomcat Server,选择Local
点进Local后会进入这样的界面,在这个界面中暂时只需关注我用红色框标注的地方即可:
首先是“打开浏览器”所在的那个红框,主要是指定在tomcat运行后,在哪个浏览器发送请求,选择一个常用的浏览器即可
然后后是点击Application server那里的configure… 然后找到之前解压的tomcat选中后 点确定。
还是点击确定
点击确定后,显示出了我们配置的tomcat,并且出现了红色框中的内容,HTTP port是tomcat的默认端口号8080。接下来点击Deployment
找到右侧+号点击选择第一个
完成后会在下面出现一个Application context,这里的是应用名,将会在浏览器中的链接输入框中显示,我们一般让他与我们的项目名保持一致,这样看起来更方便
点击应用后发现之前的URL也发生了变化,这个将会自动输入在在浏览器的地址栏中,新出现了一个JMX port,可以把它看作是idea的端口号,这样tomcat服务器就配置完了,点击确定
3、简单案例:你好servlet
在web.xml文件中写拦截请求
<url-pattern>/hello</url-pattern>//拦截请求的标签
<servlet-name>helloServlet</servlet-name>//实现了定位,当拦截到hello请求后,通过这个标签定位找到要进行的任务
案例一:
public class HelloServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response){
System.out.println("hello servlet");
try {
PrintWriter pw= response.getWriter();//获取输出流
pw.print("<h1>hello world<h1>");
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行成功后会自动进入浏览器,在浏览器地址栏中添加请求hello
进行搜索后会在浏览器界面中显示
这时我们发现借助HttpServletResponse对象,我们将后台的数据传送到了前端界面
案例二:
在web文件夹下建一个html文件
运行后在浏览器地址栏输入hello.html
点击“你好 servlet”后我们发现又进入到了案例一中的界面中,而且浏览器地址栏也变成了http://localhost:8080/javaServlet复习/hello
4、HttpServletRequest和HttpServletResponse
HttpServletRequest的父类是ServletRequest,request对象在tomcat收到用户请求时创建,内部封装全部的用户浏览器请求信息。
HttpServletResponse的父类是ServletResponse,response对象用于处理服务器到客户端的响应,内部有一个缓冲用于保存响应信息。
5、request.getParameter(“string”)
可从前台界面获取数据
案例:
前台
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="addUser" method="get">
姓名:<input type="text" name="name"><br>
密码:<input type="text" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
public class GetUsers extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf8");
PrintWriter pw=response.getWriter();
ArrayList<User> list=new ArrayList<User>();
Connection con= null;
try {
con = DBUtil.getConnection();
String st="select * from user";
PreparedStatement ps=con.prepareStatement(st);
ResultSet rs=ps.executeQuery();
while(rs.next()){
int id=rs.getInt(1);
String name=rs.getString(2);
String password=rs.getString(3);
User user=new User(id,name,password);
list.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
DBUtil.close(con);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
6、Servlet获取参数
public class Test2 extends HttpServlet {
public void init(){
ServletContext context=getServletContext();//获取全局Servlet上下文对象,拿到面向所有Servlet的全局变量
String name=context.getInitParameter("abc");
}
public void service(HttpServletRequest request, HttpServletResponse response){
ServletContext sc=this.getServletContext();//获取当前Servlet上下文对象,拿到当前Servlet中的变量
String st=sc.getInitParameter("name");
}
}
<servlet>
<servlet-name>test2</servlet-name>
<servlet-class>homework01.Test2</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>test2</servlet-name>
<url-pattern>/test2</url-pattern>
</servlet-mapping>
<context-param>
<param-name>abc</param-name>
<param-value>123</param-value>
</context-param>
< context-param>针对Servlet的一个全局变量,所有的Servlet都能读到
< init-param>只针对当前的Servlet
7、解决servlet 线程安全问题
- Servlet对象是单例的,其service(包含被其调用的doGet、doPost)方法是被Tomcat线程并发调用的。
- service方法是存在线程安全问题。
- 一般情况下,不要在Servlet中定义可读写变量!保持Servlet是无状态的类。 “定义无状态的Servlet”
- 无状态的类: 没有可以读写变量的类称为无状态类!可以有只读变量。
- 如果定义了有状态的Servlet,进行适当同步(加锁),解决线程安全问题。
二、jsp的初步使用
jsp 页面基于HTML页面,jsp是用来写页面的
jsp实际上就是servlet
在运行时,jsp页面会自动以servlet为基础被编译成Java文件,页面中的所有语句都会以printWriter.print(“< !DOCTYPE html>”)的形式编译
1、jsp运行过程:
第一次请求JSP时候
- 先将JSP翻译为一个 Servlet 源程序(.java)
- 再将Servlet源程序编译为.class文件
- 创建Servlet对象
- 执行Servlet对象的 service 方法, 处理请求与响应
第二次请求JSP时候
- 如果JSP被编辑过则重新走流程 1
- 如果JSP没有被编辑过, 则执行执行Servlet对象的 service 方法
2、热部署
如果没有热部署,每当我们对代码进行了修改时,都需要重启服务器,配置了热部署之后,当我们修改代码时,会自动重启服务器,节省时间。但是一般修改后台代码时最好还是要重启项目的,如果是前端代码则不需要。
配置热部署的方法:按照下图修改配置
3、jsp中的Java
Java声明:用于为servlet声明成员
<!-- JSP 中的"声明", -->
<%!
//用于为当前类声明 属性/方法/静态成员等
//编译以后会成为 Servlet 中的成员
int times = 55;
int add(int a, int b){
return a+b;
}
%>
Java脚本:用于处理程序逻辑, 可以写任意语句, 流程控制等
<%
//Java 脚本中的语句会翻译到 service 方法中的语句
long now = System.currentTimeMillis();
long year = now/1000/60/60/24/365 + 1970;
%>
Java表达式:用于计算并且输出表达式
<!-- JSP 表达式, 用于计算表达式值并且在网页上输出-->
<p><%=now/1000%60%></p>
<p><%=year%></p>
<p><%=add(times, 1)%></p>
使用 <%@ page %> 声明page 指令,必须放在第一行。
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.util.*,java.sql.*"
%>
4、jsp内置对象
一共有9个对象: 经常称为9大内置对象.
常用:
- request HttpServletResuest
- response HttpServletResponse
- out JspWriter 功能与 PrintWriter 一致
考点: JSP out对象的类型: JspWriter
比较常用:
-
session HttpSession 类型, 用于存储与"用户会话"有关的数据.
-
application ServletContext 类型, 用于存储与当前Servlet容器有关的数据
-
pageContext PageContext, 页面"上下文Context". PageContext是当前页面上下文, 是当前页面的大管家, 内部包含与JSP有关的全部资源.
pageContext.getRequest();//返回的对象就是 request对象
pageContext.getResponse();// 返回的对象就是 response对象
不常用(不用):
- config : ServletConfig 用于读取 web.xml 的内容
- page : Object类型, 是当前JSP对象(Servlet对象)的引用, 就是this
- exception : Exception 类型, 当前网页是错误页面时候, 用于获取异常信息.
5、转发与重定向
- 转发: 一次请求
- 为了实现 servlet与jsp协同工作, servlet处理结束以后由jsp负责显示数据, SUN 设计 servlet到jsp的转发功能.(尽管 servlet到 servlet, jsp到jsp可以转发, 但极少使用) 可以通过request 对象携带数据
- 一般都在 servlet处理以后, 转发到jsp显示数据!! 地址栏是不变化的
//绑定数据到request对象
request.setAttribute("users",list);
//转发到jsp页面
RequestDispatcher requestDispatcher=request.getRequestDispatcher("user.jsp");//获取转发器
//开始转发
requestDispatcher.forward(request,response);
jsp页面中的request对象和后台代码中的request对象可以看作是一个对象,jsp页面可以直接获取request中的所有数据
List<User> list=(List<User>) request.getAttribute("users");
- 重定向: 两次请求
- 是HTTP协议中设计的一个功能, 浏览器根据服务器的响应结果自动转向(跳转)到一个新的URL地址. 自动向浏览器地址栏发送请求 浏览器地址栏是 变化得
- 服务在响应中发送 302 状态码和Location头, 浏览器收到302就会转向到 Location头中设定的URL地址.
- 如果服务器端希望重新转向新的URL地址(发起新的GET请求)时候使用重定向.
String path=request.getContextPath();
response.sendRedirect(path+"/user/getUsers");
三、MVC
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
View(视图) - 视图代表模型包含的数据的可视化。
Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
为什么要使用MVC:组件拆分以后, 功能独立, 功能清晰, 便于分工合作.