IDEA快速搭建WEB项目【记录篇】
发布日期:2021-05-06 03:23:24 浏览次数:20 分类:技术文章

本文共 45773 字,大约阅读时间需要 152 分钟。

这里用的都是市面上通用的技术,而每个公司都有自己的调用方式,可以根据实际情况与业务场景不同去进行变通

三层架构:

 界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“”的思想。

 

Servlet项目

1、静态资源需要放在WebContent文件下,不应该在web-inf文件下

一:项目结构:

 

 二:底层数据连接:

/**

* 数据库连接
* @author 明
*
*/
public class ConnDB {
private static String driver;
private static String url;
private static String user;
private static String pwd;
/**
* 加载连接条件
*/
static{
try {
  Properties properties=new Properties();
  InputStream inputStream=ConnDB.class.getClassLoader().getResourceAsStream("db.properties");
  properties.load(inputStream);
  driver = properties.getProperty("driver");
  url = properties.getProperty("url");
  user = properties.getProperty("user");
  pwd = properties.getProperty("password");
  Class.forName(driver);
} catch (IOException e) {
  // TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
  e.printStackTrace();
}
}
/**
* 数据库连接
* @return
*/
public static Connection getConnection(){
  Connection conn=null;
try {
  conn=DriverManager.getConnection(url, user, pwd);
} catch (SQLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
  return conn;
}
/**
* 关闭连接属性
*/
public static void cose(ResultSet resultSet,PreparedStatement preparedStatement,Connection conn){

if(resultSet!=null){

try {
  resultSet.close();
} catch (SQLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
  preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
  e.printStackTrace();
}
}
if(conn!=null){
try {
  conn.close();
} catch (SQLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
}
}
}

数据处理使用工厂方式:增强通用性,会牺牲点性能

案列:

@Override

public Boolean loginUser(String userName, String userPassword) {
  boolean falg = false;
  Connection getconn = connDB();
String sql = "select * from user u where u.user_name=? and u.user_password=?";
try {
  preparedStatement = getconn.prepareStatement(sql);
  preparedStatement.setString(1, userName);
  preparedStatement.setString(2, userPassword);
  resultSet = preparedStatement.executeQuery();
  while (resultSet.next()) {
    falg = true;
  }
} catch (SQLException e) {
e.printStackTrace();
}finally {//回收资源
  ConnectionDBUtil.geetConnClose(resultSet,preparedStatement,connDB());
}
return falg;
}

三:数据业务处理:

四:前后台数据交互:

 MVC设计:

小型架构目录

├──pom.xml├──main

| ├──java
| | └──com
| | └──web
| | ├── core
| | | ├── controller //控制器包
| | | ├── entity //POJO包
| | | ├── mapper //Mapper接口包
| | | ├── service //Service接口包
| | | └── serviceImpl //service实现类包
| | └──util //工具包
| ├── resources //资源文件夹(配置文件)
| | ├──applicationContext.xml //Spring配置文件
| | ├──dbconfig.properties //数据库配置文件
| | ├──log4j.properties //log4j配置文件
| | ├──mybatis-config.xml //mybatis配置文件
| | ├──spring-mvc.xml //springMvc配置文件
| | ├──spring-mybatis.xml //spring-mybatis整合配置
| | └── mapping //mapper.xml文件夹
| | └── StudentMapper.xml
| └── webapp ///web应用部署根目录
| ├──login.html //登录页
| ├──pages //jsp文件将爱
| | └── studentList.jsp
| ├──static //静态资源文件夹
| | ├──css
| | | └── login.css
| | ├──images
| | | ├──login-img.png
| | | └── login_logo.png
| | └── js
| | └── JQuery.js
| └── WEB-INF //
| └── web.xml└──test
├── java
├── resources

 

SSH项目(spring+struts+hibernate)

常用注解:

1、Hibernate框架的

Hibernate的注解主要用在持久化类那一块:

@Entity

指定当前类是实体类。

@Entity
public class User() {
private Integer id;
private String name;
}
@Table

指定实体类和数据库表之间的对应关系。

属性:
name:指定数据库表的名称
@Entity
@Table(name="t_user")
public class User() {
private Integer id;
private String name;
}
@Id

指定当前字段是主键。

@Entity
@Table(name="t_user")
public class User() {
@Id
private Integer id;
private String name;
}
@GeneratedValue

指定主键的生成方式。

属性:
strategy :指定主键生成策略。
JPA 提供的四种标准用法为 TABLE,SEQUENCE,IDENTITY,AUTO。
@Entity
@Table(name="t_user")
public class User() {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
private String name;
}
@Column

指定实体类属性和数据库表字段之间的对应关系

属性:
name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
updateable:是否可以更新
@Entity
@Table(name="t_user")
public class User() {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_id")
private Integer id;

@Column(name = "user_name")

private String name;
}
@Temporal

设置日期时间

1
方式一:@Temporal(TemporalType.DATE)映射为日期 // birthday date (只有日期)

方式二:@Temporal(TemporalType.TIME)映射为日期 // birthday time (是有时间)

方式三:@Temporal(TemporalType.TIMESTAMP)映射为日期 //birthday datetime (日期+时间)

@Temporal(TemporalType.DATE)
private Date birthday;
@Lob
作用:设置大数据类型

方式一:

@Lob
private String text; //text longtext
方式二:

@Lob

private byte[] image; // image longblob
@Enumerated
作用:设置枚举类型

方式一:

/** 保存字符串到数据库 */

@Enumerated(EnumType.STRING)
private Role role;
方式二:

/** 保存整数到数据库 */

@Enumerated(EnumType.ORDINAL)
private Role role;
上面定义的枚举:Role

/** 角色 */

public enum Role {
游客, 会员, 管理员
}
使用:
User user = new User();
user.setRole(Role.管理员);
@Transient
作用:修饰的字段不会被持久化

@Transient

private String temp;
这样也可以:
private transient String temp;
一对多涉及的注解:

@OneToMany:

作用:建立一对多的关系映射
属性:
targetEntityClass:指定多的多方的类的字节码
mappedBy:指定从表实体类中引用主表对象的名称。
cascade:指定要使用的级联操作
fetch:指定是否采用延迟加载
orphanRemoval:是否使用孤儿删除
@ManyToOne
作用:建立多对一的关系
属性:
targetEntityClass:指定一的一方实体类字节码
cascade:指定要使用的级联操作
fetch:指定是否采用延迟加载
optional:关联是否可选。如果设置为false,则必须始终存在非空关系。
@JoinColumn
作用:用于定义主键字段和外键字段的对应关系。
属性:
name:指定外键字段的名称
referencedColumnName:指定引用主表的主键字段名称
unique:是否唯一。默认值不唯一
nullable:是否允许为空。默认值允许。
insertable:是否允许插入。默认值允许。
updatable:是否允许更新。默认值允许。
columnDefinition:列的定义信息。
多对多涉及的注解:

@ManyToMany

作用:用于映射多对多关系
属性:
cascade:配置级联操作。
fetch:配置是否采用延迟加载。
targetEntity:配置目标的实体类。映射多对多的时候不用写。
@JoinTable
作用:针对中间表的配置
属性:
nam:配置中间表的名称
joinColumns:中间表的外键字段关联当前实体类所对应表的主键字段 inverseJoinColumn:中间表的外键字段关联对方表的主键字段

@JoinColumn

作用:用于定义主键字段和外键字段的对应关系。
属性:
name:指定外键字段的名称
referencedColumnName:指定引用主表的主键字段名称
unique:是否唯一。默认值不唯一
nullable:是否允许为空。默认值允许。
insertable:是否允许插入。默认值允许。
updatable:是否允许更新。默认值允许。
columnDefinition:列的定义信息。
2、Struts2框架的
@NameSpace

出现的位置: 它只能出现在 package 上或者 Action 类上。 一般情况下都是写在 Action 类上。

作用: 指定当前 Action 中所有动作方法的名称空间。
属性:
value: 指定名称空间的名称。写法和 xml 配置时一致。 不指定的话,默认名称空间是""。
@ParentPackage

出现的位置: 它只能出现在 package 上或者 Action 类上。 一般情况下都是写在 Action 类上。

作用: 指定当前动作类所在包的父包。由于我们已经是在类中配置了,所以无需在指定包名了。
属性:
value: 指定父包的名称。
@Action

出现的位置: 它只能出现在 Action 类上或者动作方法上。 一般情况下都是写在动作方法上。

作用: 指定当前动作方法的动作名称。 也就是 xml 配置时 action 标签的 name 属性。
属性:
value: 指定动作名称。
results[]: 它是一个数组,数据类型是注解。用于指定结果视图。此属性可以没有,当没有该属性时,表示不返回任何结果视图。即使用 response 输出响应正文。
interceptorRefs[]: 它是一个数组,数据类型是注解。用于指定引用的拦截器。
@Result

出现的位置: 它可以出现在动作类上,也可以出现在 Action 注解中。

作用: 出现在类上,表示当前动作类中的所有动作方法都可以用此视图。出现在 Action 注解中,表示当前 Action 可用此视图。
属性:
name: 指定逻辑结果视图名称。
type: 指定前往视图的方式。 例如:请求转发,重定向,重定向到另外的动作。
location: 指定前往的地址。可以是一个页面,也可以是一个动作。
@Results

出现的位置: 它可以出现在动作类上,也可以出现在 Action 注解中。

作用: 用于配置多个结果视图。
属性:
value: 它是一个数组,数据类型是 result 注解。
@InterceptorRef

出现的位置: 它可以出现在动作类上或者 Action 注解中。

作用: 用于配置要引用的拦截器或者拦截器栈
属性:
value: 用于指定拦截器或者拦截器栈
3、Spring框架的
1、IOC的注解
@Component :创建对象

@Controller

把视图层类交给Spring管理

@Controller
public class UserAction() {

}

@Service

把业务层类交给Spring管理

@Service
public class UserService() {

}

@Repository

把持久层类交给Spring管理

@Repository
public class UserDao() {

}

@Autowired

根据类型自动注入对象

@Autowired
private UserDao userDao;
@Qualifier

与上面的Autowired一起用,目的根据id获取对象

//例:把持久化层交给Spring管理,并在业务层通过id注入持久化层对象
@Repository("userDao")
public class UserDao() {}

@Service

public class UserService() {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
@Resource

可以根据类型注入,也可以根据id装配,name属性就是bean的id

@Resource(name="userDao")
private UserDao userDao;
@Value

注入基本类型和字符串类型

@Scope

单例与多例的配置,默认是单例

singleton(单例);prototype(多例);request session
//例:Action是多例的,所以应配置对应的属性,而dao层是单例的,不用配置
@Controller
@Scope(value="prototype")
public class UserAction() {

}

@Repository

public class UserDao() {

}

@Configuration :

定义配置类,用于替换spring中的xml文件的

@Configuration
public class SpringConfiguration {

}

@ComponentScan:

开启注解扫描

@Configuration
//@ComponentScan(basePackages={"cn"})
//@ComponentScan(value={"cn"})
@ComponentScan({"cn"})//value:指定扫描的包【推荐,因为可以不写】
public class SpringConfiguration {

}

@PropertySource

指定的配置文件

@Configuration
@PropertySource(value="classpath:/config/jdbc.properties")
public class SpringConfiguration {
/**
* 告诉spring框架开启el表达式
* 在4.3版本以前都需要这个占位符类
* 在4.3版本之后以下代码可以省略不写
*/
@Bean
public PropertySourcesPlaceholderConfigurer createPSPC(){
return new PropertySourcesPlaceholderConfigurer();
}
}
@Bean

用在方法上面,创建对象的,根据方法的返回类型

@Component
public class JdbcConfig {

@Bean(name="dataSource")//相当于:<bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource" />

public DataSource createDataSource(){
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
try {
comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/springIOC");
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("root");
return comboPooledDataSource;
}
@Bean(name="queryRunner")
public QueryRunner createQr(@Qualifier(value="dataSource") DataSource dataSource){
return new QueryRunner(dataSource);
}
}
@Import

导入其他的配置类,交给Spring管理

1
@Configuration
@Import(value={JdbcConfig.class})
public class SpringConfiguration {
}
2、AOP的常用注解
AOP : 全称是Aspect Oriented Programming 即: 面向切面编程
需要在Spring的主配置文件中添加以下标签。开启aop注解的支持
<aop:aspectj-autoproxy/>
@Aspect

作用:把当前类声明为切面类。

@Aspect //声明为切面类
public class MyLogger {
}
@Before

作用:把当前方法看成是前置通知。

属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Aspect //声明为切面类
public class MyLogger {
//前置通知
@Before("pt1()")
public void beforePrintLog(){
System.out.println("前置通知:打印日志了......");
}
}
@AfterReturning

作用:把当前方法看成是后置通知。

属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Aspect //声明为切面类
public class MyLogger {
//后置通知
@AfterReturning("pt1()")
public void afterRetunningPrintLog(){
System.out.println("后置通知:打印日志了......");
}
}
@AfterThrowing

作用:把当前方法看成是异常通知。

属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Aspect //声明为切面类
public class MyLogger {
//异常通知
@AfterThrowing("pt1()")
public void afterThrowingPrintLog(){
System.out.println("异常通知:打印日志了......");
}
}
@After

作用:把当前方法看成是最终通知。

属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Aspect //声明为切面类
public class MyLogger {
//最终通知
@After("pt1()")
public void afterPrintLog(){
System.out.println("最终通知:打印日志了......");
}
}
@Around

作用:把当前方法看成是环绕通知。

属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Pointcut

作用:指定切入点表达式

属性:
value:指定表达式的内容
/**
* 切入点
*/
@Pointcut("execution(public void cn.service.impl.CustomerServiceImpl.saveCustomer())")
public void pt1(){}
/**
* 环绕通知:
* 是spring提供给我们的手动控制代码执行的通知,
* 方法中需要手动控制方法执行
*
* 参数中需要一个接口:Spring注入的,了解
* ProcedingJoinPoint
*/
@Around("pt1()")
public Object around(ProceedingJoinPoint pjp){
//System.out.println("最终通知:打印日志......");
Object[] obj = pjp.getArgs();//参数
//返回值
Object rtValue = null;
//手动调用方法
try {
//前置通知
System.out.println("前:打印日志");
pjp.proceed(obj);
//后置通知
System.out.println("后:打印日志");
} catch (Throwable e) {
//异常通知
System.out.println("异:打印日志");
e.printStackTrace();
}finally{
//最终通知
System.out.println("终:打印日志");
}
return rtValue;
}
3、事务的注解
@Transactiona

声明在类上是表示全局事务,声明在方法上表示局部事务,局部事务会覆盖全局事务,默认属性是传播事务,非只读

@Transactional(readOnly=true)
public class AccountServiceImpl implements IAccountService {

public Account findAccountById(Integer id) {

return ad.findAccountById(id);
}
}
@EnableTransactionManagement

开启事务管理器

@Configuration
@EnableTransactionManagement
public class SpringConfiguration {

}

版权声明:本文为CSDN博主「I7show」的原创文章
原文链接:https://blog.csdn.net/I7show/article/details/78843417

 log4j.properties:

log4j.rootLogger = DEBUG , C , D , E ### console ### log4j.appender.C = org.apache.log4j.ConsoleAppender log4j.appender.C.Target = System.out log4j.appender.C.layout = org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern = [mybatis_study][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n ### log file ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = ../logs/mybatis_study.log log4j.appender.D.Append = true log4j.appender.D.Threshold = INFO log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = [mybatis_study][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n ### exception ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File = ../logs/mybatis_study_error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = [mybatis_study][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n ###mybatis show sql### log4j.logger.com.ibatis=debug log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug log4j.logger.java.sql.Connection=debug log4j.logger.java.sql.Statement=debug log4j.logger.java.sql.PreparedStatement=debug spring-hibernate.xml:
org.hibernate.dialect.MySQL5Dialect
update
true
true
10
5
2
2000
2000
10
thread
com.hm.vo
struts2.xml:分成多个struts2文件,然后导入一个struts2文件中 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 系统登录的struts配置 -->
<!--设置项目默认的编码方式 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--当出现错误是,出现更多的错误提示 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="false" />
<!--后台系统 -->
<package name="page" namespace="/" extends="struts-default">

<!--用户和图书的curd -->

<action name="bm_*" class="com.jd.bms.sysmannage.action.CrudPageAction"
method="{1}Book">
<result name="getId">/WEB-INF/pages/system/booksystem/Bookmainshow.jsp
</result>
<result name="add">/WEB-INF/pages/system/booksystem/Bookmainadd.jsp
</result>
<result name="input">/WEB-INF/pages/system/error/Bookmainerror.jsp</result>
<result name="update">/WEB-INF/pages/system/booksystem/Bookmainupdate.jsp
</result>
<result name="adds" type="redirect">/bookshow</result>
<result name="Childadds" type="redirect">/bookshowtwo</result>
<result name="Itadds" type="redirect">/bookshowthree</result>
<result name="bankadd">/WEB-INF/pages/system/classification/Bookbankadd.jsp</result>
<result name="bankadds" type="redirect">/bookbank</result>
<result name="addUser">/WEB-INF/pages/system/usersystem/useradd.jsp</result>
<result name="usermainpage" type="redirect">/usermain</result>
</action>
<!--分页查询图书 -->
<action name="bookshow" class="com.jd.bms.sysmannage.action.PagingAction"
method="bookshow">
<result name="bookshow">/WEB-INF/pages/system/booksystem/Bookmain.jsp</result>
</action>
<action name="bookshowtwo" class="com.jd.bms.sysmannage.action.PagingAction"
method="bookshowtwo">
<result name="bookshowtwo">/WEB-INF/pages/system/booksystem/Bookmain.jsp</result>
</action>
<action name="bookshowthree" class="com.jd.bms.sysmannage.action.PagingAction"
method="bookshowthree">
<result name="bookshowthree">/WEB-INF/pages/system/booksystem/Bookmain.jsp</result>
</action>
<!-- 分页图书种类 -->
<action name="bookbank" class="com.jd.bms.sysmannage.action.PagingAction" method="bookbank">
<result name="bookbank">/WEB-INF/pages/system/classification/Bookbank.jsp</result>
</action>
<!--用户信息分页 -->
<action name="usermain" class="com.jd.bms.sysmannage.action.PagingAction"
method="usermain">
<result name="usermain">/WEB-INF/pages/system/usersystem/usermain.jsp</result>
</action>
<!--用户信息搜索 -->
<action name="user_page" class="com.jd.bms.sysmannage.action.BmUserAction" method="user_page">
<result name="input">/WEB-INF/pages/system/error/Bookmainerror.jsp</result>
<result name="user_page">/WEB-INF/pages/system/usersystem/usermain.jsp</result>
<result name="usermain_page" type="redirect">/usermain</result>
</action>
<!--留言管理:查看、回复、删除 -->
<action name="messagex" class="com.jd.bms.sysmannage.action.BmLeaveWordAction" method="messagex">
<result name="messagex">/WEB-INF/pages/system/message/userleavemain.jsp</result>
</action>
<action name="delmess" class="com.jd.bms.sysmannage.action.BmLeaveWordAction" method="delmess">
<result name="delmess" type="redirect">/messagex</result>
</action>
<!--管理员、信息查询、修改,添加管理员,管理员权限控制 -->
<action name="adminmess" class="com.jd.bms.sysmannage.action.BmAdminAction" method="adminmess">
<result name="admin">/WEB-INF/pages/system/administrator/administrator.jsp</result>
</action>
<action name="amdin_*" class="com.jd.bms.sysmannage.action.BmAdminAction" method="{1}Admin">
<result name="updateAdmin" type="redirect">/adminmess</result>
</action>
<!--用户购书的记录 -->
<!-- <action name="userBokk" class="" method="userBokk">
<result name="userBokk"></result>
</action> -->
<!-- 前端页面 -->
<!--注册 -->
<action name="engi" class="com.jd.bms.sysmannage.action.EngiAction"
method="engi">
<result name="toLogin" type="redirect">/toLogin</result>
<result name="regiPage">/registers.jsp</result>
</action>
<!--进入登录页面 -->
<action name="toLogin" class="com.jd.bms.sysmannage.action.LoginAction"
method="toLogin">
<result name="toLogin">/login.jsp</result>
</action>
<!--登录判断是否成功否则进入原页面 -->
<action name="login" class="com.jd.bms.sysmannage.action.LoginAction"
method="login">
<result name="main" type="redirect">/main</result>
<result name="usermain" type="redirect">/usermain</result>
<result name="loginPage">/login.jsp</result>
</action>
<action name="add_*" class="com.jd.bms.sysmannage.action.BmLeaveWordAction" method="{1}LeaveWord">
<result name="message" type="redirect">/message</result>
</action>
<!--个人信息 -->
<action name="person" class="com.jd.bms.sysmannage.action.BmUserAction" method="person">
<result name="person">/WEB-INF/pages/forepart/main/personmain.jsp</result>
</action>
<!--个人信息修改 -->
<action name="userupdate" class="com.jd.bms.sysmannage.action.BmUserAction" method="userupdate">
<result name="userupdate" type="redirect">/person</result>
<result name="input">/WEB-INF/pages/forepart/main/personmain.jsp</result>
</action>
<!-- 进入用户密码修改页面 -->
<action name="pwdmodil" class="com.jd.bms.sysmannage.action.BmUserPwdAction" method="pwdmodil">
<result name="pwd">/WEB-INF/pages/forepart/main/modelfoactionmain.jsp</result>
</action>
<!--修改密码后进入登录页面 -->
<action name="pwdupdate" class="com.jd.bms.sysmannage.action.BmUserPwdAction" method="pwdupdate">
<result name="pwdupdate">/WEB-INF/pages/forepart/main/modelfoactionmain.jsp</result>
<result name="toLogin" type="redirect">/toLogin</result>
</action>
<!--查询仓库中的书本数据 -->
<action name="bookshop" class="com.jd.bms.sysmannage.action.BookshopAction" method="bookshop">
<result name="bookshop">/WEB-INF/pages/forepart/main/bookshopsmain.jsp</result>
</action>
<!--插入书籍到用户仓库 返回到原视图 -->
<action name="adds_*" class="com.jd.bms.sysmannage.action.BookshopAction" method="{1}Book">
<result name="libBook" type="redirect">/main</result><!--首页 -->
<result name="literyBook" type="redirect">/Literary</result><!-- 文学页面 -->
<result name="childBook" type="redirect">/Child</result><!--少儿童书页 -->
<result name="bmitBook" type="redirect">/itbook</result>
</action>
<!--删除书籍 -->
<action name="delBook" class="com.jd.bms.sysmannage.action.BookshopAction" method="delBook">
<result name="delBook" type="redirect">/bookshop</result>
</action>
</package>
</struts>

pom.xml:

4.0.0
com.hm
ssh
1.0-SNAPSHOT
war
ssh Maven Webapp
http://www.example.com
UTF-8
4.2.9.RELEASE
5.1.7.Final
2.3.32
com.mchange
c3p0
0.9.5.4
com.mchange
mchange-commons-java
0.2.15
javax.xml.bind
jaxb-api
2.3.0
junit
junit
4.10
test
com.hynnet
javax.servlet-api
3.1.0
provided
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-orm
${spring.version}
org.apache.struts
struts2-core
${struts2.version}
org.apache.struts
struts2-spring-plugin
${struts2.version}
org.hibernate
hibernate-core
${hibernate.version}
mysql
mysql-connector-java
5.1.42
org.aspectj
aspectjweaver
1.8.10
org.slf4j
slf4j-log4j12
1.7.25
ssh
org.apache.maven.plugins
maven-compiler-plugin
2.3.2
1.7
1.7
ssh\lib

session类:

public class MySession {

@Autowired
private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory) {

this.sessionFactory = sessionFactory;
}

protected Session getCurrentSession() {

return this.sessionFactory.getCurrentSession();
}

}

dao层:

@Repository("bmAdminDao")
public class BmAdminDaoImpl extends MySession implements BmAdminDao {

@Override

public List<BmAdmin> getBmAdminLoginName(String loginname) {
List<BmAdmin> list = null;
Query q = this.getCurrentSession()
.createQuery("from BmAdmin where loginName=?")
.setString(0, loginname);
list = q.list();
if (list.size() >= 0 && list != null) {
return list;
}
return null;
}

}

service层:

@Service

@Transactional
public class BmAdminServiceImpl implements BmAdminService {

@Autowired

private BmAdminDao bmAdminDao;

public List<BmAdmin> getBmAdminLoginName(String loginname) {

// TODO Auto-generated method stub
return bmAdminDao.getBmAdminLoginName(loginname);
}

controller层:

public class BmAdminAction extends ActionSupport {

private static final long serialVersionUID = 4297180770984426910L;
@Autowired
private BmAdminService bmAdminService;
private BmAdmin bmAdmin;

public BmAdmin getBmAdmin() {

return bmAdmin;
}

public void setBmAdmin(BmAdmin bmAdmin) {

this.bmAdmin = bmAdmin;
}

public String adminmess() throws Exception {

HttpServletRequest request = ServletActionContext.getRequest();

HttpSession session = request.getSession();
String loginName = (String) session.getAttribute("loginname");
List<BmAdmin> list = bmAdminService.getBmAdminLoginName(loginName);
ActionContext ctx = ActionContext.getContext();
ctx.put("adminme", list);

return "admin";

}

}

vo层:

@Entity

@Table(name = "bm_admin")
public class BmAdmin implements Serializable {
private static final long serialVersionUID = 5938178566540780464L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "login_name", length = 100, nullable = false, unique = true)
private String loginName;
@Column(name = "password", length = 32, nullable = false)
private String password;
@Column(name = "name", length = 32, nullable = false, unique = true)
private String name;
@Column(name = "serialnumber", length = 32, nullable = false)
private String serialnumber;
@Column(name = "email", length = 32, nullable = false)
private String email;
@Column(name = "mobile", length = 32, nullable = false)
private String mobile;

public Integer getId() {

return id;
}

public void setId(Integer id) {

this.id = id;
}

public String getLoginName() {

return loginName;
}

public void setLoginName(String loginName) {

this.loginName = loginName;
}

public String getPassword() {

return password;
}

public void setPassword(String password) {

this.password = password;
}

public String getName() {

return name;
}

public void setName(String name) {

this.name = name;
}

public String getSerialnumber() {

return serialnumber;
}

public void setSerialnumber(String serialnumber) {

this.serialnumber = serialnumber;
}

public String getEmail() {

return email;
}

public void setEmail(String email) {

this.email = email;
}

public String getMobile() {

return mobile;
}

public void setMobile(String mobile) {

this.mobile = mobile;
}

@Override

public String toString() {
return "BmAdmin [id=" + id + ", loginName=" + loginName + ", password="
+ password + ", name=" + name + ", serialnumber="
+ serialnumber + ", email=" + email + ", mobile=" + mobile
+ "]";
}

}

SSM项目(spring+springMVC+mybatis)

@Component:通用注解;@Name:通用注解;@Repository:持久化层组件注解

@Service:业务层组件注解;@Controller:控制层组件注解

@Autowired注解标记也可以用在字段定义或setter方法定义前面,默认按类型匹配注入

@RequestMapping标明这个类或者方法与哪一个客户请求对应

@ResponseBody注解(在Spring MVC中,此注解与JSON响应相关)

@Transactional属性:可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

value String 可选的限定描述符,指定使用的事务管理器
propagation enum: Propagation 可选的事务传播行为设置
isolation enum: Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int (in seconds granularity) 事务超时时间设置
rollbackFor Class对象数组,必须继承自Throwable 导致事务回滚的异常类数组
rollbackForClassName 类名数组,必须继承自Throwable 导致事务回滚的异常类名字数组
noRollbackFor Class对象数组,必须继承自Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组

@Qualifier:Qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,添加@Qualifier注解,需要注意的是@Qualifier的参数名称为我们之前定义@Service注解的名称之一。

@resource注入时比较简单了注解自带了“name”的val就是@Service注解的名称之一

 @RequestParam:Spring会自动将表单参数注入到方法参数(名称一致)

@ModelAttribute:当Controller组件处理后,需要向JSP传值用此方法

@ExceptionHandler注解提供了Spring MVC处理异常的方法

AOP切面编程通知:

spring aop的5种通知类型都有

Before前置通知

AfterReturning后置通知

Around环绕通知

AfterThrowing异常通知

After最终通知

@PathVariable作用是将URI请求模板中的变量解析出来,映射到处理方法的参数上

@RequestMapping(value = "/emp/{id}",method = requestMethod.GET)

public String execute(@PathVariable("id") int id){

  //查询操作处理

  return " ";

}

SpringMVC中对数据在传输过程中的result风格处理方式:

@RequestMapping(value="book",method=RequestMethod.POST) //添加

@RequestMapping(value="book",method=RequestMethod.DELETE)//删除

 @ResponseBody

利用AJAX发送请求

@RequestMapping(value="book",method=RequestMethod.PUT).//修改

利用Ajax,在客户端发出PUT、DELETE动作的请求

在form请求中:

在web.xml配置过滤器:

HiddenHttpMethodFilter

org.springframework.web.filter.HiddenHttpMethodFilter

<input type="hidden" name="_method" value="PUT"/>

<input type="hidden" name="_method" value="DELETE"/>

@RequestMapping(value="book",method=RequestMethod.GET)//查询

1、项目结构

 

 2、配置文件:

applicationContext.xml

//这个配置文件只能配置别名、缓存等特性,不能在该配置文件扫描mapper.xml文件

 jdbc.properties:

driver =com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/login?useUnicode=true&characterEncoding=utf8 username=root password=root mybatis-config.xml:
spring-mvc.xml:
web.xml
ssm
contextConfigLocation
classpath:applicationContext.xml
encodeFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encodeFilter
/*
org.springframework.web.context.ContextLoaderListener
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
dispatcherServlet
/
DruidStatView
com.alibaba.druid.support.http.StatViewServlet
DruidStatView
/druid/*
login.jsp

controller层:

@Controller public class loginController {       @RequestMapping("/")     public String loginPage() {           return "login";     } }
service层:

@Override

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public void funttwosfer(int formUserId, int id, BigDecimal money) {
System.out.println("进入转账");
BigDecimal formmoney = fundao.getMoney(formUserId);
if (!(formmoney.compareTo(money) == -1)) {
// 转出账户减掉金额
fundao.subMoney(formUserId, money);
// int i = 10 / 0;// 测试异常
// 收到账户添加金额
fundao.addMoney(id, money);
}
System.out.println("结束转账");
}

dao层:

Mapper配置文件中的sql动态编写,可根据mybatis文档中的各种关键字一一对应实现:

测试类:

类注解:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:applicationContext.xml"})
具体测试
@Resource
private UserService userService;

@Test

public void demo1(){
UserBaseInfo userBaseInfo=userService.getUserBaseInfo(1);
System.out.println("我要输出内容了");
System.out.println(userBaseInfo.getUserName());
System.out.println("haha");
}

pom.xml相关信息:

modelVersion Maven模块版本,目前我们一般都取值4.0.0
groupId 整个系统的名称。
artifactId 子模块名称。
packaging 打包类型,可取值:jar,war等等,这个配置用于package的phase,具体可以参见package运行的时候启动的plugin,后面有机会我们会讲述如何配置打包的插件。
4.0.0
com.exp
learn
war
1.0-SNAPSHOT
learn Maven Webapp
UTF-8
4.2.9.RELEASE
2.5.0
junit
junit
4.12
test
org.springframework
spring-core
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-test
${spring.version}
test
org.mybatis
mybatis
3.2.8
org.mybatis
mybatis-spring
1.2.2
mysql
mysql-connector-java
5.1.6
com.alibaba
druid
1.0.12
org.aspectj
aspectjweaver
1.8.4
log4j
log4j
1.2.17
javax.servlet
servlet-api
3.0-alpha-1
provided
javax.servlet
jstl
1.2
org.codehaus.jackson
jackson-mapper-asl
1.9.13
com.alibaba
fastjson
1.2.3
com.fasterxml.jackson.core
jackson-annotations
${jackson.version}
com.fasterxml.jackson.core
jackson-core
${jackson.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
commons-io
commons-io
2.4
commons-fileupload
commons-fileupload
1.2.2
junit
junit
3.8.1
test
com.github.pagehelper
pagehelper
5.1.8
com.baomidou
mybatis-plus
3.0.5
learn
org.apache.maven.plugins
maven-compiler-plugin
3.5.1
1.8
1.8

通过将应用多模块拓展,水平扩展相应的组件,来满足当前的需求

Maven多模块项目

 1、公共模块(编码过程中需要重复用到的工具,减少繁杂度)

2、数据处理模块(各种条件下的增删查改等,有利于服务层的重复利用)

3、服务层模块(具体逻辑的处理与编写,在一二的基础上更加得心应手)

4、控制层模块(用于数据处理以个性的方式与前台交互渲染)

SOA(面向服务的架构)-------》ESB架构(企业服务总线)

场景:更多的传统企业

提供多系统集成更廉价的解决方案

esb:

传统技术与XML、Web服务等技术结合

soa:

将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来

  嵌入式编程、约定大于配置、组件化开发、微服务开发、针对开发与业务为主、是web服务精简版

SpringBoot项目

搭建项目:new-->Project-->Spring Initralizr

 

 pom文件:

4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.9.RELEASE
com.hm
springbootdemo
0.0.1-SNAPSHOT
war
springbootdemo
Demo project for Spring Boot
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-tomcat
provided
org.springframework.boot
spring-boot-starter-test
test
javax.servlet
jstl
org.apache.tomcat.embed
tomcat-embed-jasper
org.mybatis
mybatis
3.5.2
org.springframework.boot
spring-boot-devtools
true
org.springframework.boot
spring-boot-starter-log4j
unknown
src/main/java
**/*.xml
org.springframework.boot
spring-boot-maven-plugin
application.properties文件:(可用yml文件替换)
server.port=8080 #日志打印 logging.level.org.springframework=debug logging.level.org.mybatis=debug logging.level.org.apache.ibatis=debug #数据库连接 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql:/localhost:3306/yhm?useUnicode=true&useSSL=true spring.datasource.username=root spring.datasource.password=root
#SpringMVC相关页面解析器配置 spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
#mapper文件扫描 mybatis.mapper-locations=classpath*:com/hm/springbootdemo/dao/*.xml mybatis.type-aliases=com.hm.springbootdemo.vo

 dao层:

@Mapper @Repository("userLoginValidate") public interface UserLoginValidate {               public boolean login(@Param("account")String account,@Param("password") String password); } mapper配置文件
 
service层:
public interface UserService {       public boolean login(String account,  String password); }
@Service("userService") public class UserServiceImpl implements UserService {       @Autowired     private UserLoginValidate userLoginValidate;     @Override     public boolean login(String account, String password) {           boolean login = userLoginValidate.login(account, password);         if (login==true){               return true;         }         return false;     } }

 controller层:

@RequestMapping("/login") public String requestMainPage(@Param("account")String account,@Param("passwoud") String password){       if (account!=null||password!=null){           boolean login = userService.login(account, password);         if(login==true){               return "main";         }         return "index";     }     return "index"; }

提供良好的开箱即用经验的典型用例和可扩展性机制覆盖。

springColud

 场景:大型互联网企业

 项目搭建:

填写包名--项目名--打包样式:

 

 暂时不选择模板依赖:

 

 注意项目名与项目所放路径

 Springcolud微服务初始构架:

 

 IDEAmaven设置地址:

 maven的初始化文件:(项目开发可以自己另行添加)

4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.9.RELEASE
com.example
springcolud
0.0.1-SNAPSHOT
springcolud
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin

 设置项目需要隐藏的文件

 创建子模块

 可以将父级模块中的文件删除,留下pom文件作为父级通用依赖管理者

 

 父级pom.xml文件:

4.0.0
spring-colud-ms-eureka
org.springframework.boot
spring-boot-starter-parent
2.1.9.RELEASE
com.example
springcolud
0.0.1-SNAPSHOT
springcolud
pom
Demo project for Spring Colud
UTF-8
UTF-8
2.0.0.RELEASE
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter
${spring-cloud.version}
org.springframework.boot
spring-boot-maven-plugin
子级pom文件:
4.0.0
com.example
spring-colud-ms-eureka
0.0.1-SNAPSHOT
spring-colud-ms-eureka
jar
eureka for project
com.example
springcolud
0.0.1-SNAPSHOT
UTF-8
UTF-8
1.8
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-maven-plugin
在本地配置hosts文件

 

在启动器上加入服务注册注解

@EnableDiscoveryClient

@EnableDiscoveryServer

@EnableEurekaServer:对应的版本问题:(待学习)

 springcolud子模块构架

 application.properties文件

#声明本服务在注册中心展示的名字、也是在网关访问时定位服务的名字 spring.application.name=spring-cloud-ms-eureka #在windows下的hosts文件中增加了  127.0.0.1  swapping1 eureka.instance.hostname=swapping1 server.port=8000 #是否将自己作为服务注册到注册中心,默认为true,false不能将自己注册到自己, #如果有多个服务注册中心的微服务的话,可以将这个设置为true,表示可以将注册中心1注册到注册中心2中 eureka.client.register-with-eureka=false #表示是否从eureka注册中心中获取注册信息,默认为true eureka.client.fetch-registry=false #注册中心的交互地址,设置多个地址可以用,分隔  查询服务和注册服务都需要依赖这个地址 #关于设置注册中心这么关键的服务,如果是单点话,遇到故障就是毁灭性的。 #在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。为了维持其可用性,使用集群是很好的解决方案 #所以 在一个分布式系统中,设置最少两个服务注册中心是最基本的 eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/ 注意每一个端口对应一个服务

单体架构

技术选型非常灵活,优先满足快速上线的要求

 垂直架构

将系统分为不同的层级,每个层级有对应的职责

服务性架构

服务内部高内聚,服务之间低耦合

 

微服务架构

强调每个服务都有单独的运行空间

上一篇:WebService知识点
下一篇:Java 十大排序算法

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年03月21日 19时30分33秒