MVC 中的正确结构 spring
correct structure in MVC with spring
我对正确的 mvc 模式有点困惑。
这是我的配置文件:在这个 class 我有所有的 Bean。
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = " name.web.controller")
@PropertySource("classpath:NewLibrary.properties")
@EnableTransactionManagement
@Bean
public UserRepo getUserService() {
return new UserImpl(getDataSource());
}
@Bean
public BookRepo getBookService() {
return new BookImpl(getDataSource());
}
这是我的接口 UserRepo 和接口 UserService。他们是一样的
public interface UserService {
public String getUser();
void add(UserModel u);
UserModel getById(int id);
UserModel getByName(String name);
UserModel getByCognome(String surname);
Optional<UserModel> findOne(int id);
public void insert(User u);
public String giveName();
List<UserModel>ByNome(String nome);
List<UserModel> ByPassAndUsername(String password, String username);
}
我的class实现了这个接口
@Repository
public class UserImpl extends AbstractDao<UserModel, Integer> implements UserRepo {
@PersistenceContext
private EntityManager em;
@Autowired
public UserRepo userRepo;
private JdbcTemplate conn;
@Override
@Transactional
public void add(UserModel u) {
em.persist(u);
}
public UserImpl(DataSource ds) {
conn= new JdbcTemplate(ds);
}
@Override
public UserModel getById(int id) {
return em.find(UserModel.class, id);
}
@Override
public UserModel getByName(String nome) {
CriteriaBuilder queryBuilder= em.getCriteriaBuilder();
CriteriaQuery<UserModel> query=
queryBuilder.createQuery(UserModel.class);
Root<UserModel> rec= query.from(UseriModel.class);
query.select(rec).where(queryBuilder.equal(rec.get("nome"), nome));
UserModel ut=em.createQuery(query).getSingleResult();
em.clear();
return ut;
//return em.find(UtentiModel.class, nome);
};
我终于得到了我的控制器
在我的控制器中,我@Autowired UsersRepo/它是一个接口/。
而且我的代码有效,我可以进行所有的 CRUD 操作。
但是,有人告诉我这不是正确的方法。我不能直接自动装配。
UserRepo 的 @Autowired,在 Controller class 内。
所以我在网上搜索信息,并创建了一个服务 class。
它的服务是这样的:具有与我在 UserRepo Inteface 中编写的相同方法相同的接口。在我创建实现该接口的 class 之后,称为 UserSeviceImpl。
在userServiceImpl中进入@Autowire UserRepo接口,然后进入Controller中的@Autowire userService。
但是现在我的代码不起作用,我在所有控件的所有页面中都有 404 状态:`请求的资源 [/bookProject/] 不可用
说明源服务器没有找到目标资源的当前表示,或者不愿意公开表示存在。`
我在控制台中没有错误,只有信息:
INFO: Command line argument: -Dfile.encoding=UTF-8
set 30, 2021 5:41:10 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib]
set 30, 2021 5:41:10 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
set 30, 2021 5:41:10 PM org.apache.catalina.startup.Catalina load
INFO: Server initialization in [624] milliseconds
set 30, 2021 5:41:10 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Catalina]
set 30, 2021 5:41:10 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet engine: [Apache Tomcat/9.0.50]
set 30, 2021 5:41:12 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
set 30, 2021 5:41:12 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
set 30, 2021 5:41:12 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory [/home/viktoriya/Scrivania/apache-tomcat-9.0.50/webapps/ROOT]
set 30, 2021 5:41:12 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory [/home/viktoriya/Scrivania/apache-tomcat-9.0.50/webapps/ROOT] has finished in [13] ms
set 30, 2021 5:41:12 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
set 30, 2021 5:41:12 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in [2050] milliseconds
所以我无法理解我是否错误地自动装配了一些 bean,或者我当前的模式是否错误,或者我是否需要更改配置中的某些内容 class,或者我是否没有应用class服务好。因为在我的代码运行良好之前。
这是我的控制器:
@控制器
public class 用户控制器 {
@Autowired
私人用户服务我们;
列出用户;
@GetMapping("/新")
public ModelAndView new(模型模型) {
UserModel users= new UserModel();
model.addAttribute("utenteForm", user);
return new ModelAndView("client", "utenteForm", new
UtentiModel());
}
@PostMapping("/add")
public ModelAndView sumbit(@ModelAttribute("utenteForm") UserModel users)
{ us.ad(users);
这是 UserServiceImpl:
@Service
public class UserServiceImpl implements UserService{
private final static Logger log=
Logger.getLogger(UserServiceImpl.class.getName());
@Autowired
private UserRepo userRepo;
@PersistenceContext
private EntityManager em;
@Override
public void add(UserModel u) {
userRepo.add(u);
}
@Override
public UserModel getByName(String name) {
return userRepo.getByName(name);
}
我想说的是检查您根据控制器定义调用的路径。如果您更新代码以同时查看控制器,我认为这会有所帮助。
示例:
@RestController
@RequestMapping("/test")
public class TestRestController{
@Autowired
private TestService testService;
.....
}
@Service
public class TestServiceImpl implements TestService {
@Autowired
private TestRepository testRepository;
}
@Repository
@Transactional
public class TestRepositoryImpl implements TestRepository{
}
我对正确的 mvc 模式有点困惑。
这是我的配置文件:在这个 class 我有所有的 Bean。
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = " name.web.controller")
@PropertySource("classpath:NewLibrary.properties")
@EnableTransactionManagement
@Bean
public UserRepo getUserService() {
return new UserImpl(getDataSource());
}
@Bean
public BookRepo getBookService() {
return new BookImpl(getDataSource());
}
这是我的接口 UserRepo 和接口 UserService。他们是一样的
public interface UserService {
public String getUser();
void add(UserModel u);
UserModel getById(int id);
UserModel getByName(String name);
UserModel getByCognome(String surname);
Optional<UserModel> findOne(int id);
public void insert(User u);
public String giveName();
List<UserModel>ByNome(String nome);
List<UserModel> ByPassAndUsername(String password, String username);
}
我的class实现了这个接口
@Repository
public class UserImpl extends AbstractDao<UserModel, Integer> implements UserRepo {
@PersistenceContext
private EntityManager em;
@Autowired
public UserRepo userRepo;
private JdbcTemplate conn;
@Override
@Transactional
public void add(UserModel u) {
em.persist(u);
}
public UserImpl(DataSource ds) {
conn= new JdbcTemplate(ds);
}
@Override
public UserModel getById(int id) {
return em.find(UserModel.class, id);
}
@Override
public UserModel getByName(String nome) {
CriteriaBuilder queryBuilder= em.getCriteriaBuilder();
CriteriaQuery<UserModel> query=
queryBuilder.createQuery(UserModel.class);
Root<UserModel> rec= query.from(UseriModel.class);
query.select(rec).where(queryBuilder.equal(rec.get("nome"), nome));
UserModel ut=em.createQuery(query).getSingleResult();
em.clear();
return ut;
//return em.find(UtentiModel.class, nome);
};
我终于得到了我的控制器 在我的控制器中,我@Autowired UsersRepo/它是一个接口/。 而且我的代码有效,我可以进行所有的 CRUD 操作。
但是,有人告诉我这不是正确的方法。我不能直接自动装配。 UserRepo 的 @Autowired,在 Controller class 内。 所以我在网上搜索信息,并创建了一个服务 class。 它的服务是这样的:具有与我在 UserRepo Inteface 中编写的相同方法相同的接口。在我创建实现该接口的 class 之后,称为 UserSeviceImpl。
在userServiceImpl中进入@Autowire UserRepo接口,然后进入Controller中的@Autowire userService。
但是现在我的代码不起作用,我在所有控件的所有页面中都有 404 状态:`请求的资源 [/bookProject/] 不可用
说明源服务器没有找到目标资源的当前表示,或者不愿意公开表示存在。`
我在控制台中没有错误,只有信息:
INFO: Command line argument: -Dfile.encoding=UTF-8
set 30, 2021 5:41:10 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib]
set 30, 2021 5:41:10 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
set 30, 2021 5:41:10 PM org.apache.catalina.startup.Catalina load
INFO: Server initialization in [624] milliseconds
set 30, 2021 5:41:10 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Catalina]
set 30, 2021 5:41:10 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet engine: [Apache Tomcat/9.0.50]
set 30, 2021 5:41:12 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
set 30, 2021 5:41:12 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
set 30, 2021 5:41:12 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory [/home/viktoriya/Scrivania/apache-tomcat-9.0.50/webapps/ROOT]
set 30, 2021 5:41:12 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory [/home/viktoriya/Scrivania/apache-tomcat-9.0.50/webapps/ROOT] has finished in [13] ms
set 30, 2021 5:41:12 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
set 30, 2021 5:41:12 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in [2050] milliseconds
所以我无法理解我是否错误地自动装配了一些 bean,或者我当前的模式是否错误,或者我是否需要更改配置中的某些内容 class,或者我是否没有应用class服务好。因为在我的代码运行良好之前。
这是我的控制器: @控制器 public class 用户控制器 { @Autowired 私人用户服务我们; 列出用户; @GetMapping("/新") public ModelAndView new(模型模型) {
UserModel users= new UserModel();
model.addAttribute("utenteForm", user);
return new ModelAndView("client", "utenteForm", new
UtentiModel());
}
@PostMapping("/add")
public ModelAndView sumbit(@ModelAttribute("utenteForm") UserModel users)
{ us.ad(users);
这是 UserServiceImpl:
@Service
public class UserServiceImpl implements UserService{
private final static Logger log=
Logger.getLogger(UserServiceImpl.class.getName());
@Autowired
private UserRepo userRepo;
@PersistenceContext
private EntityManager em;
@Override
public void add(UserModel u) {
userRepo.add(u);
}
@Override
public UserModel getByName(String name) {
return userRepo.getByName(name);
}
我想说的是检查您根据控制器定义调用的路径。如果您更新代码以同时查看控制器,我认为这会有所帮助。
示例:
@RestController
@RequestMapping("/test")
public class TestRestController{
@Autowired
private TestService testService;
.....
}
@Service
public class TestServiceImpl implements TestService {
@Autowired
private TestRepository testRepository;
}
@Repository
@Transactional
public class TestRepositoryImpl implements TestRepository{
}