admin管理员组

文章数量:1574593

Web开发学习——servet技术学习(包含java代码)

什么是servet

sun公司制订的一种用来扩展web服务器功能的组件规范。

扩展web服务器功能:

早期的web服务器(比如apacheiis)只能够处理静态资源的 请求(即需要事先将html准备好),不能够处理动态资源的请求( 即需要通过计算,生成html)。

早期使用CGI程序来扩展。

(了解):

CGI(Common Gateway Interace 通用网关接口) 可以使用perlcc++等语言来开发符合CGI接口要求的程序来 扩展web服务器的功能,但是,开发繁琐,并且可移植性比较差, 现在用得很少了。

现在使用Servlet来扩展。

组件规范:

a.什么是组件?

符合规范,实现部分功能,并且需要部署到相应的容器里面才能 运行的软件模块。

Servlet就是一个组件,需要部署到Servlet容器里面才能运行。

b.什么是容器?

符合规范,为组件提供运行环境的程序。

Tomcat就是一个符合Servlet规范的容器,为Servlet提供运行 环境(即提供网络相关的服务)。

写一个servlet步骤

基本步骤

step1.写一个java类,实现Servlet接口或者继承 HttpServlet类。

step2.编译。

step3.打包。 创建一个具有如下结构的文件夹: appname(应用名) WEB-INF classes(.class文件) lib(.jar文件,可以没有) web.xml (部署描述文件)

step4.部署。

step3创建好的整个文件夹拷贝到容器。

注:

可以使用jar命令将step3创建好的整个文件夹

压缩成.war为后缀的文件,然后再拷贝。

step5.启动容器,访问Servlet

http://ip:port/appname/url-pattern

:

url-patternweb.xml中设置。

用maven工程创建 in eclipse

step1.创建一个maven工程,注意要选war

step2.工程建立好之后,会有异常提示,是因为默认情况下,工程 没有web.xml文件,根据提示邮件生成web.xml

step3.指定运行环境,运行环境提供了我们开发servlet需要的一些包

添加tomcat容器

step4.添加Servlet类,并在web.xml文件中添加部署描述信息

1、创建Servlet

package web;

import java.io.IOException;

import java.io.PrintWriter

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet{

    public HelloServlet(){

        System.out.println("HelloServlet's constructor");

    }

   

    /**

     * 当容器(比如tomcat)收到请求之后,

     * 会帮我们解析请求数据包,并且将解析到的

     * 数据存放到request对象里面(开发人员

     * 只需要调用request对象的方法就可以获得

     * 请求数据包中的数据),同时,容器还会创建

     * response对象(开发人员只需要将处理结果存放

     * response对象上,容器会用我们创建响应数据

     * 包并发送)

     * 接下来,容器会调用service方法,并且将

     * request对象和response对象作为方法的参数

     * 传进来。

     */

    public void service(HttpServletRequest request,HttpServletResponse response)

    throws ServletException,IOException{

       

        /*

         * 读取请求参数值。

         * 请求参数名不能写错,否则会获得null值。

         */

        String name = request.getParameter("name");

        String age = request.getParameter("age");

        int age1 = Integer.parseInt(age) + 1;

       

        /*

         * 设置content-type消息头,告诉

         * 浏览器,服务器返回的数据类型。

         */

        response.setContentType("text/html");

        /*

         * 通过response对象获得输出流。

         */

        PrintWriter out = response.getWriter();

        /*

         * 将数据存放到response对象上。

         * 容器会从response对象上获取数据,

         * 创建响应数据包,然后将响应数据包

         * 发送给浏览器。

         */

        out.println("<h1>Hello " + name + "</h1>");

        out.println("<h1>age:" + age + "</h1>");

        out.close();

    }

}

2 web.xml

    <servlet>

        <servlet-name>helloServlet</servlet-name>

        <servlet-class>web.HelloServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>helloServlet</servlet-name>

        <url-pattern>/hello</url-pattern>

    </servlet-mapping>

step5.部署应用,启动容器

step6.打开浏览器,按照http://ip:port/appname/url-pattern 访问Servlet

处理乱码问题

Servlet输出中文

a.为什么会有乱码?

因为out.println方法,默认情况下,会使用iso-8859-1 编码。

b.如何解决?

response.setContentType( "text/html;charset=utf-8");

表单包含有中文参数值,如何处理

(1)为什么会有乱码?

提交表单时,浏览器会按照打开该表单所在的页面时的字符集 对中文进行编码,比如使用utf-8来编码;而服务器端默认会使用 iso-8859-1来解码,所以会产生乱码。

(2)如何解决?

1)情形一: post请求

/* * 这行代码要添加到所有的getParameter方法的 * 最前面。 * 作用是告诉服务器,针对post请求,使用 * 哪种字符集来进行解码。 */

 request.setCharacterEncoding("utf-8");

2)情形二: get请求

如果是tomcat8以下的版本,需要修改server.xml, <Connector URIEncoding="utf-8" /> 作用是,告诉服务器,针对get请求,使用utf-8来解码。

 如果是tomcat8及以上的版本,对于get请求,默认就是使用utf-8来解码的。

Servlet访问数据库(使用jdbc)

step1.建库、建表

step2.导包。

        <dependencies>

            <dependency>

                <groupId>mysql</groupId>

                <artifactId>mysql-connector-java</artifactId>

                <version>5.1.6</version>

            </dependency>

            <dependency>

                <groupId>commons-dbcp</groupId>

                <artifactId>commons-dbcp</artifactId>

                <version>1.4</version>

            </dependency>

        </dependencies>

step3.添加DBUtils类和jdbc.properties文件。

step4.Servlet类里面,使用jdbc api访问数据库。

封装DAO类

-DBUties工具类

    package util;

    import java.io.IOException;

    import java.io.InputStream;

    import java.sql.Connection;

    import java.sql.ResultSet;

    import java.sql.SQLException;

    import java.sql.Statement;

    import java.util.Properties;

    import org.apachemons.dbcp.BasicDataSource;

    public class DBUtils {

        private static BasicDataSource ds;

        static{

            //创建数据源对象

            ds = new BasicDataSource();

            //读取配置文件

            Properties p = new Properties();

            InputStream ips =

                    DBUtils.class.getClassLoader()

                    .getResourceAsStream("jdbc.properties");

            try {

                p.load(ips);

                String driver = p.getProperty("driver");

                String url = p.getProperty("url");

                String username = p.getProperty("username");

                String password = p.getProperty("password");

                //设置连接信息

                ds.setDriverClassName(driver);

                ds.setUrl(url);

                ds.setUsername(username);

                ds.setPassword(password);

                ds.setInitialSize(3);//设置初始连接数量

                ds.setMaxActive(5);//设置最大连接数量

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

        public static Connection getConn() throws Exception{

            //获取连接对象  注意导包别导错   异常抛出

            Connection conn = ds.getConnection();

            System.out.println(conn);

            return conn;

        }

       

        /**

        * 按照jdbc规范,连接关闭的时候,对应的

        * Statement以及ResultSet应该自动关闭。

        * 但是,有一些连接池的实现,没有完全符合

        * 规范,导致关闭连接时,对应的Statement

        * ResultSet并没有关闭。所以,建议在

        * 关闭连接时,最好手动关闭Statement

        * ResultSet

        *

        */

        public static void close(ResultSet rs,

                Statement stat,Connection conn){

            if(rs != null){

                try {

                    rs.close();

                } catch (SQLException e) {

                }

            }

           

            if(stat != null){

                try {

                    stat.close();

                } catch (SQLException e) {

                }

            }

           

            if(conn != null){

                try {

                    conn.close();

                } catch (SQLException e) {

                }

            }

        }

-jdbc.properties

        driver=com.mysql.jdbc.Driver

        url=jdbc:mysql://localhost:3306/jsd1902db?useUnicode=true&characterEncoding=UTF-8

        username=root

        password=root

-DAO

    package dao;

    import java.sql.Connection;

    import java.sql.PreparedStatement;

    import java.sql.ResultSet;

    import java.util.ArrayList;

    import java.util.List;

    import entity.User;

    import util.DBUtils;

    /**

    *   DAO类:

    *     封装了数据访问逻辑。

    *

    */

    public class UserDAO {

        /**

        * 将所有用户信息查询出来。

        */

        public List<User> findAll()

                throws Exception{

            List<User> users =

                    new ArrayList<User>();

           

            Connection conn = null;

            PreparedStatement stat = null;

            ResultSet rs = null;

            try {

                conn = DBUtils.getConn();

                stat = conn.prepareStatement(

                    "SELECT * FROM t_user");

                rs = stat.executeQuery();

                while(rs.next()){

                    User user = new User();

本文标签: 代码技术webservetJava