JavaServlet+jsp基础使用

本文介绍了Servlet的基础配置,如Tomcat服务器设置和HelloServlet案例,同时涵盖jsp的使用、MVC模式、EL表达式与状态管理。重点讲解了如何获取参数、线程安全及数据共享,还涉及过滤器与监听器的应用。
摘要由CSDN通过智能技术生成

一、初步配置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 线程安全问题

  1. Servlet对象是单例的,其service(包含被其调用的doGet、doPost)方法是被Tomcat线程并发调用的。
  2. service方法是存在线程安全问题。
  3. 一般情况下,不要在Servlet中定义可读写变量!保持Servlet是无状态的类。 “定义无状态的Servlet”
  4. 无状态的类: 没有可以读写变量的类称为无状态类!可以有只读变量。
  5. 如果定义了有状态的Servlet,进行适当同步(加锁),解决线程安全问题。

二、jsp的初步使用

jsp 页面基于HTML页面,jsp是用来写页面的
jsp实际上就是servlet
在运行时,jsp页面会自动以servlet为基础被编译成Java文件,页面中的所有语句都会以printWriter.print(“< !DOCTYPE html>”)的形式编译

1、jsp运行过程:

第一次请求JSP时候

  1. 先将JSP翻译为一个 Servlet 源程序(.java)
  2. 再将Servlet源程序编译为.class文件
  3. 创建Servlet对象
  4. 执行Servlet对象的 service 方法, 处理请求与响应

第二次请求JSP时候

  1. 如果JSP被编辑过则重新走流程 1
  2. 如果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大内置对象.

常用:

  1. request HttpServletResuest
  2. response HttpServletResponse
  3. out JspWriter 功能与 PrintWriter 一致

考点: JSP out对象的类型: JspWriter

比较常用:

  1. session HttpSession 类型, 用于存储与"用户会话"有关的数据.

  2. application ServletContext 类型, 用于存储与当前Servlet容器有关的数据

  3. pageContext PageContext, 页面"上下文Context". PageContext是当前页面上下文, 是当前页面的大管家, 内部包含与JSP有关的全部资源.

pageContext.getRequest();//返回的对象就是 request对象
pageContext.getResponse();//  返回的对象就是 response对象

不常用(不用):

  1. config : ServletConfig 用于读取 web.xml 的内容
  2. page : Object类型, 是当前JSP对象(Servlet对象)的引用, 就是this
  3. exception : Exception 类型, 当前网页是错误页面时候, 用于获取异常信息.

5、转发与重定向

  1. 转发: 一次请求
    1. 为了实现 servlet与jsp协同工作, servlet处理结束以后由jsp负责显示数据, SUN 设计 servlet到jsp的转发功能.(尽管 servlet到 servlet, jsp到jsp可以转发, 但极少使用) 可以通过request 对象携带数据
    2. 一般都在 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");
  1. 重定向: 两次请求
    1. 是HTTP协议中设计的一个功能, 浏览器根据服务器的响应结果自动转向(跳转)到一个新的URL地址. 自动向浏览器地址栏发送请求 浏览器地址栏是 变化得
    2. 服务在响应中发送 302 状态码和Location头, 浏览器收到302就会转向到 Location头中设定的URL地址.
    3. 如果服务器端希望重新转向新的URL地址(发起新的GET请求)时候使用重定向.
String path=request.getContextPath();
response.sendRedirect(path+"/user/getUsers");

三、MVC

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
View(视图) - 视图代表模型包含的数据的可视化。
Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

在这里插入图片描述
为什么要使用MVC:组件拆分以后, 功能独立, 功能清晰, 便于分工合作.

四、EL表达式与JSTL

EL表达式与JSTL

五、状态保持问题:Cookie、Session

状态保持问题:Cookie、Session

六、数据共享范围

数据共享范围

七、过滤器与监听器

过滤器与监听器

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值