Java Web案例 阶段总结

1 创建新的模块,引入坐标

<dependencies>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
  </dependency>
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.5</version>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
  </dependency>
  <dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.14.3</version>
  </dependency>
</dependencies>
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.0</version>
    </plugin>
  </plugins>
</build>

2 创建三层架构的包结构

com.ithiema.mapper
com.ithiema.service
com.ithiema.web

3 创建数据库表
4 创建实体类

com.ithiema.pojo

5 MyBatis 基础环境

(1) 创建Mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<package name="com.itheima.pojo"/>
		<!--name属性的值是实体类所在包。-->
		<!--为com.itheima.pojo包下所有类设置别名,别名为类名。这样,sql映射文件中返回值就不必再写完整的路径。-->
	</typeAliases>
	<environments default="development">
	<!--environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment。-->
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<!--数据库连接信息-->
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql:///**数据库名**?useSSL=false&amp;serverTimezone=UTC"/>
				<!--若运行时出现时区错误问题,则在url后面加上?serverTimezone=UTC,若出现不安全信息,在后面加上?useSSL=false。-->
				<!--若使用预编译则加上useServerPrepStmts=true-->
				<!--//xml文件中不识别&,应使用转义字符&amp;。-->
				<property name="username" value="root"/>
				<property name="password" value="**密码**"/>
			</dataSource>
		</environment>
		<environment id="test">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<!--数据库连接信息-->
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql:///mybatis"/>
				<property name="username" value="root"/>
				<property name="password" value="**密码**"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!--如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。-->
		<package name="com.itheima.mapper"/>
	</mappers>
</configuration>

(2) 创建XXXMapper.xml
//在 resources 下创建 com/itheima/mapper 目录,并在该目录下创建 UserMapper.xml 映射配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.XXXMappe">			
	<!--注意该文件夹在resource下,是文件夹不是包,因此使用/而非.。-->
	<!--Mapper代理开发要求1:设置SQL映射文件的namespace属性为Mapper接口全限定名。-->
	<resultMap id="brandResultMap" type="实体类名">
		<!-- id标签:完成主键字段的映射
				column属性:主键字段的字段名
				property属性:实体类的属性名
			result标签:完成一般字段的映射
				column属性:一般字段的字段名
				property属性:实体类的属性名  -->
		<result column="数据库字段" property="java变量"/>
		<result column="数据库字段" property="java变量"/>
		<!--在上面只需要定义字段名和属性名不一样的映射,而一样的则不需要专门定义出来。-->
	</resultMap>
</mapper>

(3) 创建XXXMapper接口
//Mapper代理开发要求2:定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。

public interface UserMapper {
}		

6 编写mapper接口方法

通过mybatis插件直接生成statement,或使用注解开发。
//SQL语句中的字段必须与数据库内的字段相同。

7 编写XXXService类

(1) 创建com.ithiema.util,编写SqlSessionFactoryUtils工具类

public class SqlSessionFactoryUtils {
	private static SqlSessionFactory sqlSessionFactory;
	static {
		//静态代码块会随着类的加载而自动执行,且只执行一次
		try {
			String resource = "mybatis-config.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static SqlSessionFactory getSqlSessionFactory(){
		return sqlSessionFactory;
	}
}

(2) 编写XXXService类方法

//获取SqlSession
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取Mapper代理
XXXMapper XXXMapper = sqlSession.getMapper(XXXMapper.class);
//执行sql
XXXMapper.方法名();
//提交事务:增删改需提交事务
sqlSession.commit();
//释放资源
sqlSession.close();

8 编写servlet类

//post请求中文出现乱码:request.setCharacterEncoding("UTF-8");
(1) 调用XXXService类方法
XXXService XXXService = new XXXService();
XXXService.方法名();
(2) 存入request域中
request.setAttribute("XXX",XXX);
(3) 转发到jsp
request.getRequestDispatcher("/XXX.jsp").forward(request,response);

9 编写JSP

(1) 若使用EL表达式
<%@ page isELIgnored="false"%>
(2) 若使用JSTL
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

10 问题

(1) 若查询数据据,部分未显示,考虑数据库字段与变量不一致。
(2) 若查询数据乱码,考虑post请求方式未转码。
(3) 若增删改失败,考虑SQL语句编写问题,或,未提交事务。
(4) Public Key Retrieval is not allowed
    不要在JDBC连接串中加入useSSL=false
(5) Tomcat访问项目出现HTTP状态404-未找到,类型 状态报告 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。
    Run–>Edit Configurations…,选择Deployment,将Application context里面的内容删除,置空或只留一个 / 即可
(6) java.rmi.server.ExportException: Port already in use: 1099; nested exception is
    查找占用1099端口的进程:netstat -aon|findstr 1099
    关闭占用该端口的进程:taskkill -f -pid 进程id
(7) IDEA Junit 测试 no test were found
    进行单元测试的方法不能有返回值
    进行单元测试的方法需要是public方法
(8) idea 项目右键没有maven
    在项目pom.xml文件中,点击右键,选择Add as Maven Project
(9) 右键无法new出servlet
    点击右侧maven,刷新。
(10) 若EL表达式被当作字符串处理:在JSP中加入<%@ page isELIgnored="false"%>
(11) MysqlDataTruncation: Data truncation: Data too long for column ‘name‘ at row 1
    <1> 前端传输的“name”的数据太长(超出数据库设计的长度)
    <2> POST请求方式字符集不匹配造成乱码
        request.setCharacterEncoding("UTF-8");
(12) JSP通过参数获取主键的两种方式
  将路径设置为"/Servlet?id = X"
    //这里用的是拼接,直接输入url拼接就是get请求,自然servlet能获取到元素,直接输入网址到servlet就是get请求。
    //因此id作为参数可以被getParameter()方法获取。
    <input type="hidden" name="id" value="${实体类名.id}">

posted @ 2023-03-19 17:15  10kcheung  阅读(35)  评论(0)    收藏  举报