初识JavaWeb

    技术2026-04-13  10

    初识JavaWeb

    1.Tomcat

    Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的***Web 应用服务器。***

    本地url请求过程

    目录结构

    bin目录下为一些可执行文件等等

    webapps为存放网站的文件

    网站的基本结构

    2.Maven

    Maven提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。

    目录结构

    maven_repo为架包

    阿里云镜像的配置

    <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>

    3.Tomcat和Maven的下载

    官网下载

    4.IDEA中的创建Maven与配置Tomcat

    5.HelloWorld

    pom.xml配置

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>com</artifactId> <version>1.0-SNAPSHOT</version> <modules> <module>com.csn.serverlet</module> </modules> <packaging>pom</packaging> <name>com Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <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.3</version> </dependency> </dependencies> </project>

    dependencies中放的很多的dependency都是架包,可以在maven官网上搜索导入

    在main目录下创建java和resources文件夹

    创建helloworld.java

    import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class helloWorld extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello CSN!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello CSN!</h1>"); out.println("</body>"); out.println("</html>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    注意此时已经jsp和servlet架包已经导入maven

    配置web.xml

    配置xml实现从web服务器到java文件的映射

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> <display-name>Welcome to Tomcat</display-name> <description> Welcome to Tomcat </description> <servlet> <servlet-name>CSNTEST</servlet-name> <servlet-class>helloWorld</servlet-class>//这里是关键,指向目标java文件 </servlet> <servlet-mapping> <servlet-name>CSNTEST</servlet-name> <url-pattern>/hellocsn2</url-pattern>//这里是路由地址,即浏览器访问的url地址 </servlet-mapping> </web-app>

    6.pom.xml的继承

    我们可以在根目录下创建一个新的maven项目,此时maven继承于父maven,各种架包无需重复导入,大大提升开发效率

    7.ServletContext

    ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫***全局应用程序共享对象。***

    1.共享数据

    在一个servlet中保存数据,可以在另一个servlet中获取

    存数据

    package com.csn.servelet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class servletDemo04_1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context=this.getServletContext(); context.setAttribute("username","小陈"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print("<h1>设置字段成功</h1>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    取数据

    package com.csn.servelet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class servletDemo04 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context=this.getServletContext(); String username=(String)context.getAttribute("username"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print("名字:"+username); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    2.获得初始化参数

    在web.xml中定义初始化参数

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/myhabits</param-value> </context-param> </web-app>

    读数据

    package com.csn.servelet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class servletContext extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context=this.getServletContext(); String url=context.getInitParameter("url"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print(url); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }

    3.请求转发

    不同于重定位

    package com.csn.servelet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class servletDemo03 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context=this.getServletContext(); context.getRequestDispatcher("/servletcontext").forward(req,resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }

    4.读取资源文件

    在resource下建立一个db.properties文件,里面写上信息

    然后将其读出

    package com.csn.servelet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class servletDemo05 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is =this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Properties prop=new Properties(); prop.load(is); String username=prop.getProperty("username"); String pwd=prop.getProperty("pwd"); resp.getWriter().print(username+":"+pwd); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    在java目录下建立一个db.properties文件,里面写上信息

    然后将其读出

    需要注意如果直接点生成,java文件夹中的properties的文件会被过滤掉

    因此需要在子pom.xml中配置

    <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>

    此时在执行后就会在tatget的java目录下生成properties文件

    然后再通过servlet访问

    package com.csn.servelet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class servletDemo06 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is =this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/csn/servelet/db.properties"); Properties prop=new Properties(); prop.load(is); String username=prop.getProperty("username"); String pwd=prop.getProperty("pwd"); resp.getWriter().print(username+":"+pwd); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    此外需要注意的是以上的servlet都需要在web.xml中进行配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/myhabits</param-value> </context-param> <servlet> <servlet-name>helloworld</servlet-name> <servlet-class>com.csn.servelet.helloworld</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloworld</servlet-name> <url-pattern>/hellocsn</url-pattern> </servlet-mapping> <servlet> <servlet-name>servletcontext</servlet-name> <servlet-class>com.csn.servelet.servletContext</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletcontext</servlet-name> <url-pattern>/servletcontext</url-pattern> </servlet-mapping> <servlet> <servlet-name>servledemp03</servlet-name> <servlet-class>com.csn.servelet.servletDemo03</servlet-class> </servlet> <servlet-mapping> <servlet-name>servledemp03</servlet-name> <url-pattern>/servledemp03</url-pattern> </servlet-mapping> <servlet> <servlet-name>servledemp041</servlet-name> <servlet-class>com.csn.servelet.servletDemo04_1</servlet-class> </servlet> <servlet-mapping> <servlet-name>servledemp041</servlet-name> <url-pattern>/Startservledemp04</url-pattern> </servlet-mapping> <servlet> <servlet-name>servledemp04</servlet-name> <servlet-class>com.csn.servelet.servletDemo04</servlet-class> </servlet> <servlet-mapping> <servlet-name>servledemp04</servlet-name> <url-pattern>/Runservledemp04</url-pattern> </servlet-mapping> <servlet> <servlet-name>servledemp05</servlet-name> <servlet-class>com.csn.servelet.servletDemo05</servlet-class> </servlet> <servlet-mapping> <servlet-name>servledemp05</servlet-name> <url-pattern>/servledemp05</url-pattern> </servlet-mapping> <servlet> <servlet-name>servledemp06</servlet-name> <servlet-class>com.csn.servelet.servletDemo06</servlet-class> </servlet> <servlet-mapping> <servlet-name>servledemp06</servlet-name> <url-pattern>/servledemp06</url-pattern> </servlet-mapping> </web-app>

    8.Response

    重定向:url会发生改变

    转发:url不会发生改变

    9.HttpServletRequest

    将前端请求的信息都封装到这个类里面,通过调用类来获得信息

    10.Cookie

    11.Session

    12.JSP

    错误页面设置

    <error-page> <error-code>500</error-code> <location>/common/error.jsp</location> </error-page>

    导入别的页面

    <html> <body> <h2>Hello World!</h2> <%@include file="common/header.jsp"%> <jsp:include page="/common/header.jsp"/>/*建议使用*/ </body> </html>

    13.JSTL

    14.JavaBean

    必须有无参构造

    属性必须私有化

    必须有对应的get/set方法

    一般用来的和数据库的字段做映射ORM

    ORM对象关系映射

    表对应类

    字段对应属性

    表记录对应对象

    15.三层架构MVC

    Model:

    业务处理:业务层

    数据持久层CURD

    View

    展示数据

    提供发起servlet请求

    Controller

    接受用户请求

    交给业务层处理对应代码

    控制视图跳转

    早期:

    用户直接访问控制器,控制器直接访问数据库

    架构:没有什么是加一层是解决不了的

    MVC

    16.Fliter

    过滤器:过滤网站的数据:

    解决乱码登陆验证

    其实和servlet一样

    1.导包不要导错

    package com.csn.Fliter; import javax.servlet.*; import java.io.IOException; public class EncodingFliter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { } @Override public void destroy() { } }

    2.编辑过滤层

    package com.csn.Fliter; import javax.servlet.*; import java.io.IOException; public class EncodingFliter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("EncodingFliter启动"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8"); chain.doFilter(request,response);//必须得要加的东西 } @Override public void destroy() { System.out.println("EncodingFliter关闭"); } }

    3.设置mapping

    <servlet> <servlet-name>testFilter</servlet-name> <servlet-class>com.csn.servelet.TestFilter</servlet-class> </servlet> <servlet-mapping> <servlet-name>testFilter</servlet-name> <url-pattern>/show</url-pattern> </servlet-mapping> <servlet> <servlet-name>testFilter2</servlet-name> <servlet-class>com.csn.servelet.TestFilter</servlet-class> </servlet> <servlet-mapping> <servlet-name>testFilter2</servlet-name> <url-pattern>/Filter/show</url-pattern> </servlet-mapping> <filter> <filter-name>filter</filter-name> <filter-class>com.csn.Fliter.EncodingFliter</filter-class> </filter> <filter-mapping> <filter-name>filter</filter-name> <url-pattern>/Filter/*</url-pattern> </filter-mapping>

    17.基于Filter的权限管理

    1.用户登记之后,向session中向放入用户的数据

    package com.csn.Fliter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class LoginServelt extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username=req.getParameter("username"); if(username.equals("admin")){ req.getSession().setAttribute("USER_SESSION",req.getSession().getId()); resp.sendRedirect("/sys/success.jsp"); }else { resp.sendRedirect("/error.jsp"); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }

    2.利用Filter过滤器实现进主页的时候要判断用户是否已经登陆

    package com.csn.Fliter; import javax.servlet.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class sysFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest)req; HttpServletResponse response=(HttpServletResponse)resp; if(request.getSession().getAttribute("USER_SESSION")==null){ response.sendRedirect("/error.jsp"); } chain.doFilter(request,response); } @Override public void destroy() { } }

    配置mapping

    <filter> <filter-name>sysfilter</filter-name> <filter-class>com.csn.Fliter.sysFilter</filter-class> </filter> <filter-mapping> <filter-name>sysfilter</filter-name> <url-pattern>/sys/*</url-pattern> </filter-mapping>

    18.JDBC

    1.加载驱动

    2.连接数据库

    3.向数据库发送SQL的对象statement:CURD

    4.编写sql语言

    5.执行SQL语言

    6.关闭连接

    开启事务:

    connection.setAutoCommit(false

    很重要!!!

    19.单元测试

    配置

    <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency>

    使用

    package com.csn.jdbc; import org.junit.Test; public class test { @Test public void test(){ System.out.println("hello"); } }

    est,response); }

    @Override public void destroy() { }

    }

    配置mapping ```java <filter> <filter-name>sysfilter</filter-name> <filter-class>com.csn.Fliter.sysFilter</filter-class> </filter> <filter-mapping> <filter-name>sysfilter</filter-name> <url-pattern>/sys/*</url-pattern> </filter-mapping>

    18.JDBC

    1.加载驱动

    2.连接数据库

    3.向数据库发送SQL的对象statement:CURD

    4.编写sql语言

    5.执行SQL语言

    6.关闭连接

    开启事务:

    connection.setAutoCommit(false

    很重要!!!

    19.单元测试

    配置

    <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency>

    使用

    package com.csn.jdbc; import org.junit.Test; public class test { @Test public void test(){ System.out.println("hello"); } }
    Processed: 0.009, SQL: 9